ECL Command List:
-----------------------------------------------------------------04.06.2002---
Meas. data:     Etot Pmom Eint Pint  Eday Emon Eyear  Pday Pmon Pyear
                Emax EmaxDay EmaxMon EmaxYear  Pmax PmaxDay PmaxMon PmaxYear
Meas. data list:Eint Pint FORMAT INDEX SYNC
Analog values:  ANA ANAMIN ANAMAX ANAFAKTOR ANAOFFSET ANAMODE
Station param.: STATION Group  STATUS  RELAY  LEVEL  Language DATEFORMAT
                TARIFF TARIFFSOURCE TariffFIX COSTFAC
Channel param:  CMODE CHANNEL LNAME Eunit Punit MCONST URAT IRAT PFACTOR
                ONOFF STARTSTOP CFIX CFACTOR EDGE PULSE
Virt. channels: DVSUM DVIRT DELTA
Mathematics:    SQRT SIN COS ASIN ACOS DEG RAD EXP LOG LOG10 **
                ABS FRAC FIX INT INTR MAX MIN MOD
Stack-Op's:     + - * /  & | ^ ~  && || ^^ ~~  SHR SHL  < <= > >= == !=
                DUP DROP SWAP PICK STKS PRINT !
Branch:         IF IFF ELSE ENDIF
Loops:          ALL ALS NEXTA  FORI I NEXTI  DO DOWHILE  EXIT  RETURN  PAUSE
Programs:       P PLIST  H HLIST HBREAK  HTD  ERR ERRNR LERR  REM
                MENUAPP  EVENTAPP LISTEVENTs
Variables:      A ALIST  B BLIST
COM:            TX1 TX2  COMLOCK COMOPEN SETCOMS  DCF
ECS LAN:        BUS DIR DIRN DIRS INDIR KENN SETID SYSTEST
LON:            LONID LONZW LONSTOP
Time commands:  TIME DATE  TM TMD  HTD  LASTUPD  FROM TO DURATION  SUWI
OTHER:          ENUM FINDER DELIMITER DISPLAY MELD KEY VER ERRSTAT ERRCHAN
                PASSWORD LOGIN LOGOUT WHOAMI
------------------------------------------------------------------------------
General: INFO  SYNTAX  EXTENSION  PARAMETER  STRINGS  STACK  IDs  RS232
For help on a topic:  HELP <CommandName>  >  or  ? <CommandName>  >

______________________________________________________________________________

                        ECL - Energy Control Language
                        =============================
                                     U1601
                        =============================

  Gossen-Metrawatt GmbH, Thomas-Mann-Str.16-20, D-90471 Nuremberg, Germany

  Copyright(c) 1991-2002 by HR, Hans Rffler Computer Hard+Soft,
                            D-76137 Karlsruhe, Germany


The Information given below is available from any U 1601 device via terminal.

______________________________________________________________________________

ECL Command List:
-----------------------------------------------------------------04.06.2002---
Meas. data:     Etot Pmom Eint Pint  Eday Emon Eyear  Pday Pmon Pyear
                Emax EmaxDay EmaxMon EmaxYear  Pmax PmaxDay PmaxMon PmaxYear
Meas. data list:Eint Pint FORMAT INDEX SYNC
Analog values:  ANA ANAMIN ANAMAX ANAFAKTOR ANAOFFSET ANAMODE
Station param.: STATION Group  STATUS  RELAY  LEVEL  Language DATEFORMAT
                TARIFF TARIFFSOURCE TariffFIX COSTFAC
Channel param:  CMODE CHANNEL LNAME Eunit Punit MCONST URAT IRAT PFACTOR
                ONOFF STARTSTOP CFIX CFACTOR EDGE PULSE
Virt. channels: DVSUM DVIRT DELTA
Mathematics:    SQRT SIN COS ASIN ACOS DEG RAD EXP LOG LOG10 **
                ABS FRAC FIX INT INTR MAX MIN MOD
Stack-Op's:     + - * /  & | ^ ~  && || ^^ ~~  SHR SHL  < <= > >= == !=
                DUP DROP SWAP PICK STKS PRINT !
Branch:         IF IFF ELSE ENDIF
Loops:          ALL ALS NEXTA  FORI I NEXTI  DO DOWHILE  EXIT  RETURN  PAUSE
Programs:       P PLIST  H HLIST HBREAK  HTD  ERR ERRNR LERR  REM
                MENUAPP  EVENTAPP LISTEVENTs
Variables:      A ALIST  B BLIST
COM:            TX1 TX2  COMLOCK COMOPEN SETCOMS  DCF
ECS LAN:        BUS DIR DIRN DIRS INDIR KENN SETID SYSTEST
LON:            LONID LONZW LONSTOP
Time commands:  TIME DATE  TM TMD  HTD  LASTUPD  FROM TO DURATION  SUWI
OTHER:          ENUM FINDER DELIMITER DISPLAY MELD KEY VER ERRSTAT ERRCHAN
                PASSWORD LOGIN LOGOUT WHOAMI
------------------------------------------------------------------------------
General: INFO  SYNTAX  EXTENSION  PARAMETER  STRINGS  STACK  IDs  RS232
For help on a topic:  HELP <CommandName>  >  or  ? <CommandName>  >

______________________________________________________________________________

General information on using the ECL interpreter commands:

Interrupt current output: ^X (CTRL and X at the same time)

Interrupt output of background programs:
- Input possible, despite output
- Interrupt command: see HBREAK (16s pause for H programs)
- Control character ^B suspends simultaneous output of H programs for
  10 seconds (H program output is ignored for this period)

Obtaining help on specific topics:
- Not all the letters of a search term need to be entered if the abbreviated
  form is unambiguous.
- Short forms exist for certain commands (given in brackets); the command
  search also works with the shortened commands.
- Complete output of all help topics:  ? BOOK

Compatibility:
- The implemented ECL version is upwards compatible to the ECL for
  U1600/10/15 stations.
  New commands or command formats, which are not available with the
  U1600/10/15 stations, are identified as follows:
  (U1600: n.a.) : not available
  (U1600: l.a.) : limited availability, i.e. only with direct COM access via
                  U1600/10/15 NOT available.

______________________________________________________________________________

ECL SYNTAX - Meta-Language for Definitions
===================================================
<abcd> :=       : Definition
[ ]             : Optional details
<ab> | <cd>     : Alternatives
{ .. }          : List
[..]^           : Repeat (>=0)
{..}^           : Repeat (>=1)
__              : Blank

<command_sequence> := <ID><command> [ , | ; <command_sequence>]
<command> := <text><ext> [__<par>[__<par>[__..]]] [=[<par>[__<par>[__..]]]]

<ID>            :=  {A AA A1 .. A9 AN B B1 .. B9 C .. Z4 ZZ} : | :: [__]
<ext>           :=  [{  ! + - # . * % / ^ $ _ ? | @  }]^
<par>           :=  <real> | <string> | <enumeration> | . | $
<real>          :=  <integer>[ E <integer>]
<integer>       :=  [- | +]{0 .. 9}^
<string>        :=  [" | ']  <text> [__<text>]^  [' | "]
<text>          :=  {a .. z A .. Z 0 .. 9 _ - +}^
<enumeration>   :=  { * ** # ## <channel> } [ .. | + | - | ^ [ <channel>]]^
<channel>               :=  <integer> | {V1 .. V8}

______________________________________________________________________________

The extension <ext> influences the commands. [see example]
=============                                             [  EXTEXAMPLES  ]
The following rules normally apply:
-   :   Suppress output (where provided)
--  :   Divert output to string buffer (command must recognise ext. %)
+   :   Concatenate output (NO new line at the beginning)
!   :   Forces output (e.g. P!3 prints a listing of program P3)
%   :   The first parameter formats the output (see PRINTFORMAT)
&   :   The ID is also printed at the start of the line (see ID)
*   :   Command modification, e.g. pulse instead of energy output (see Etot)
@   :   Command modification (dependent on the particular command)
_   :   Harmonized (re-writable) output of energy commands
|   :   Additional output format options (see Etot)
.   :   Database output, separator ';', terminator <CR><LF>
..  :   Same as .  but with separator ';' between output blocks
... :   Same as .. but separation of continuous lines with ';', not <CR><LF>
#   :   Output main value only. ## and ### similar to .. and ...
$   :   Used with . or #, output of names in ""  ($$ : time also)
/   :   Output with time details (other details see FROM or TO)
^   :   Output with time details with seconds count from 1/1/90
?   :   Ignore error message "Function not available"

______________________________________________________________________________

Examples of the use of extensions

Etot    1+V2      :     Etot (01:Room501 ) = 874.01 kWh
                        Etot (V2:Room777 ) = 12.74 kWh
Etot.   1+V2      :     Etot;1;Room501;874.0124;kWh
                        Etot;26;Room777;12.739;kWh
Etot..  1+V2      :     Etot;1;Room501;874.0124;kWh;Etot;26;Room777;12.739;kWh
Etot#   1+V2      :     874.0124
                        12.739
Etot##  1+25+V2   :     874.0124;100;12.739
EMON_   1 2       :     EMon 01 2 = 500.00 kWh          [re-writable]
EMON*   1 2       :     EMon* (01:Room501 ) = 50000.00  [number of pulses]
EMON//  1 2       :     01.09.92 00:00:00--01.10.92 00:00:00  EMon-2 (01:...
EMON/## 1..4 2    :     01.10.92;00:00:00;500;1.1234;7555;0.0001
EMON^## 1..4 2    :     86745600;500;1.1234;7555;0.0001

INTERVAL&        :     A:INTERVAL = 15 minutes

______________________________________________________________________________

Commands take the following PARAMETERS (examples):

General Numeric Data:
=========================
  -12.34E3      : <real>
  8             : <integer>
  0x12ab        : <hexadecimal> (32 bit)
  0b100101      : <binary>      (32 bit)
  .             : from stack (5/4 rounded, see below)
  i             : current i meter variable, j+k analog  (U1600: l.a.)
  t             : real-time second number with 1/1000 fraction  (U1600: l.a.)
  t_            : second number with 1/1000 fraction from
                  operating hours counter                       (U1600: l.a.)
                Please observe station references for time queries (see TIME)

General String Input:
======(see STRINGS)=======
Hello           : <string>
"Hello 'World'" : <string> with "" limited because blanks are included.
$               : from string clipboard

Enumerations:   [see FINDER for searching by name]
=============   <enumeration> range: 1..64 or (if possible) 0..63
  2..9+15+17    : 2 to 9 and 15 and 17
  5+V1..V4      : 5 and V1(=25) to V4(=28)
  2..16-5-8+24  : 2 to 16 and 24, not including 5 and 8
  *             : all ON channels (see ONOFF). If no reference possible: '**'
  #             : all formatted channels (see FORMAT)
  **            : 1 to 32
  *-3..6        : all '*', but not including 3 to 6
  *+7^+10..12   : complement of (all '*' and 7) plus 10 to 12
  .             : single item from stack, decimals places removed
  ..            : enumeration number from stack, see ENUM
  i             : current i, j or k meter variable              (U1600: l.a.)

Device Specific Enumerations:   (from ECSys V2.45)              (U1600: n.a.)
=============================
  *AA           : all analog output modules     (AnaMODID == 2)
  *AE           : all analog input modules      (AnaMODID == 1)
  *EN           : all ENergy channels           (CMODE == 2..4)
  *EV           : all possible EVent applications (EVENTAPP)
  *ERR          : all channels with ERRchan <> 0
  *ERIS         : all channels with INSERVICE <> 0 (ERRCHAN-24)
  *LA           : all Lon Analog input channels (CMODE == 5,6 == LonAna,LonPE)
  *LI           : all Lon binary Input channels (CMODE == 6 == LonInp)
  *LO           : all LOn energy channels       (CMODE == 4 == LOn)
  *LR           : all Lon Relay channels        (CMODE == 7 == LonRel)
Notes:
- Special enumerations are device specific, that means they are dependent of
  the command's address context.
- Upper / lower case is of no importance.
- "." pops one single enumeration element from stack and performs 5/4 rounding
  (from 04/2002). Until 03/2002 fractional digits are zeroed only, which is
  problematic with smallest deviations (e.g. 1,999999).
- The specific enumeration can be extended but only one specific enumeration
  per expression is allowed.
        ENUM *LR+*LI            : wrong (result is equal to *LI)
        ENUM *LR+3^             : ok    (inverse of *LR + channel 3)
- If the addressed device can't evaluate the specific enumeration the result
  will contain no elements.

______________________________________________________________________________

System wide search for channel names, relay names or station names:

- Instead of <enumeration> the name of the channel required can be entered for
  channel related functions (also relay names with REL... and station names
  with ID). A search is conducted throughout the ECS LAN system, starting
  with the prompt station.
- The search term must begin with a letter, otherwise a $ must be placed in
  front of it.
- "name*" searches for the first occurrence of "name....", regardless of case.
- "name**" provides all matching channels starting with the first
  possible (!) station.
- <search_term>& searches only the current station.
- <search_term)@ suppresses '.. not found' messages.

FINDER (FI) : Function to provide station details for the search term.

Call:           FINDER <search_term>
Stack:          - >>> <channel_number> <IDnumber> <1:found/0:not_found>
Ext.:           * (search for relay name)       @ (search for station name)

______________________________________________________________________________

STRINGS

Inserting special / control characters to strings with '\' prefix:
\#      :  "                    \"      :  "
\|      :  '                    \'      :  '
\\      :  \
\b      :  0x08 backspace
\l      :  0x12 ^L
\n      :  0x0A (LF)
\r      :  0x0D (CR)
\t      :  0x09 (TAB)
\nnn    :  nnn= '3 digit decimal number' in accordance with the character code
\000    :  insert nothing                                       (U1600: l.a.)
\-      :  do not convert remaining characters (%..., \...)     (U1600: l.a.)

- Characters not mentioned:  \z ---> z
- Conversion of the meta-codes into the corresponding character
  does NOT take place during the ASSIGNMENT of a string (except \" and \'):
    p='! "Letter \#\065\#"' , p!     : P 0='! "Letter \#\065\#"'
    p                                   : Letter "A"

______________________________________________________________________________

Parameter Stack
===============
The parameter stack is a LIFO memory, which transfers numeric parameters
between commands. The stack can be manipulated with certain commands
(DUP DROP PICK SWAP ...). Commands remove stack values (pop) and add new
ones as well (push).

Stack Depth:    63
Data Type  :    <real> : 64 bit floating point number
                        (15 significant decimal places)

Stack performance is an integral part of command definition.
The following applies in general: VALUES ARE NEVER PUSHED TO THE STACK during
writing (use the '=' character).

Note: The stack and the buffer are only valid during the processing of a line
(interlacing of programs possible). The stack is erased when the prompt
returns. This creates a consistent programming environment.

Clipboard
==============
A clipboard is available for strings, which always contains the last string
results during reading. For example, the STATION command stores the name of
the station to the clipboard during reading. Reference is made to the
clipboard under Parameters: '$'

Variables
=========
64 registers A0 .. A63 are available for long term storage of
<real> numbers (see A, B).

______________________________________________________________________________

Each station possesses a unique ID.
There are 255 IDs:  A, A1..A9, B, B1..B9 ... Z4,
and several special IDs:
AA:     ID for the station connected to the RS232 interface
ZZ:     ID of the station indicated by the interpreter prompt
AN:     Gets an ID as a number from the stack (A==1 .. Z4==255)
--------
AP:     ID of the PAN-D which corresponds to the REG-D line context
AR:     ID of the REG-D which corresponds to the PAN-D line context

A1::<command>   or   A1::      : complete ID context switch
A1: <command>   or   A1:, ...  : switches ID for current line only
A1:<command>                     : ID applies to current <command> only

Example of special ID ZZ:
  A P program is started while logged on to a remote station. P contains an
  ALL loop from which a further P program is called which relates to the
  same logical station. Because reference to the fixed station is not
  provided within the ALL loop, ZZ: makes it possible to reinstate the
  fixed reference, without having to name the station explicitly.
  <C> .. All, .. , P 15, ...     calls P 15 from ALL stations
  <C> .. All, .. , ZZ:P 15, ...  calls P 15 only from station C:

______________________________________________________________________________

RS 232 Interface Protocol:
^M  (RETURN)      13d   : sends the input line, the system prompt appears
                          after the response (e.g. <A1>) [no prompt: ^W^M]
^J  (CTRL-RETURN) 10d   : as RETURN, but ^Z (SUB,26d) appears instead of the
                          prompt (intended for host connections)
^X  (CAN)         24d   : Cancel output, erase all buffers and flags
^Y  (EM)          25d   : Erase line, no output
ESC               27d   : Erase line, cursor moves to new line on screen
---- Protocol Flags ----
^B  (STX)         02d   : Suppresses input echo for current line
^A  (SOH)         01d   : Prefix for coded error message:  ^A nnn
^A^A                    : Same as ^A, but with error text: ^A <ErrText>
^V  (SYN)         22d   : Erase internal checksum and prefix for output
                          with "Checksum after SUB"
^V^V                    : Checksum must follow ^M or ^J, response: ACK/NAK

-  Protocol Flags ^A, ^V and ^B always only apply to the next command.
-  ^V and ^B suppress inclusion of H program output for 10s+command duration.
-  Checksum: addition to 16-bit INT, fixed 4-digit representation in HEX.

______________________________________________________________________________

                           ECL - Command Reference
                           =====================

______________________________________________________________________________

+ - * / **  < <= > >= == !=  & && | || ^ ^^ XOR  !
==================================================
+  :    a  b >>> (a+b)
-  :    a  b >>> (a-b)
*  :    a  b >>> (a*b)
/  :    a  b >>> (a\b)
** :    a  b >>> (a to the b power)

>  :    a  b >>> (Comparison a > b)             [TRUE= 1, FALSE= 0]
>= :    a  b >>> (Comparison a >= b)
<  :    a  b >>> (Comparison a < b)
<= :    a  b >>> (Comparison a <= b)
== :    a  b >>> (Comparison a equal to b)
!= :    a  b >>> (Comparison a not equal to b)

&  :    a  b >>> (a logical AND b)      && : bit-wise AND (32 bit)
|  :    a  b >>> (a logical OR b)       || : bit-wise OR  (32 bit)
^  :       a >>> (NOT a)                ^^ : bit-wise complement (32 bit)
XOR:    a  b >>> (a 32 bit-bit-wise XOR b)      [XOR: exclusive OR]

!  :    Stack output function, takes a number from the stack and outputs it.
        See PRINT for other uses of the ! command.

Bit Shift and Binary/BCD Transformations
=====================================
SHL     :: a n >>> (Shift 32 bit Left  n*)      SHL <n> :: a >>> (Sh... n*)
SHR     :: a n >>> (Shift 32 bit Right n*)      SHR <n> :: a >>> (Sh... n*)

BIN2BCD :: bin >>> bcd          Binary --> BCD; example: 1234 >>> 0x1234
BCD2BIN :: bcd >>> bin          BCD --> Binary; example: 0x1234 >>> 1234

Notes:
- Commands identified with "::" have only limited availability with U1600/10/15
  (U1600: l.a.).
- The following applies to logical comparisons:  False: equal to 0.0,
  True: not equal to 0.0

______________________________________________________________________________

General Number Manipulations: ABS FRAC INT INTR MIN MAX MOD

               Stack:
ABS     :     x  >>>  absolute value function (x)
FRAC    :     x  >>>  fraction (x)
INT     :     x  >>>  integral part (x)
INTR    :     x  >>>  5/4 rounded integral part (x)
MIN     :  a  b  >>>  (the smaller of a and b)
MAX     :  a  b  >>>  (the greater of a and b)
MOD     :  a  b  >>>  (a modulo b)

______________________________________________________________________________

A 0 .. A 63     : Register A 0 .. A 63 for <real> numbers
B 0 .. B 63     : Register A 0 .. A 63 for <real> numbers

Query   : A <enumeration> [= <newValue>]
Read-out        : no,           yes with ext.:   + # . % !
Stack   : -  >>> <contents_Ai>          total created for enumerations
Ext.    : + - # . % !   ++ --

- without <enumeration> == A 0
- A1 .. A63 correspond to A 1 .. A 63,  A5! == A! 5
- Increment (+1):  A++ <enumeration>
- Decrement (-1):  A-- <enumeration>
- Addition of <value> to register:      A++ <enumeration>=<value>
- Subtraction of <value> from register: A-- <enumeration>=<value>
- <newValue>=={t|z} assigns the current time in seconds for U1600/10/15 as
  well (with 1/100s).

ALIST   or   ALIST <enumeration> : Lists A Registers (corresponds to A! *)

______________________________________________________________________________

ALL  NEXTA (NA)  :  Program loop "all IDs"
==========================================
The loop command allows a command to address all stations. There is
no control variable, and the current ID of the line is incremented
(only IDs from stations connected to the ECS LAN).

Call:   ALL [<from_IDNumber> [<to_IDNumber>]]           NEXTA
Output: no                                              no
Stack:  - >>> -                                         - >>> -
Ext.:   -       : omits the station with the current ID

Call:   ALL [<from ID>: [<toID>:]]              (U1600: l.a.)
Call:   ALL [<selection>]                       (U1600: l.a.)

- With <selection> : { A | B | U | R | P | * }, the device list is limited to
  a given device class (see DIR).
- When calling P sub-programs from within the ALL loop, please refer to the
  example of special ID ZZ: (see ID)
- See example in INDIR for a demonstration of the internal sequence of ALL...

Examples:
  ALL , etot 1, nexta     output: Etot Channel-1 for all devices
  ALL-, etot 1, nexta     output: Etot Channel-1 for all devices except for
  prompt device


ALS  NEXTA (NA)  : Program loop "all IDs in a list"             (U1600: l.a.)
===================================================
Diese Schleifenkonstrukt ermglicht das Ansprechen aller Stationen einer Liste.
Es gibt keine Laufvariable, die aktuelle Kennung fr die Zeile wird der
Reihe nach aus der Liste ausgewhlt. Mit der Ext.'+' werden auch Kennungen
ausgewhlt, die nicht im ECS-LAN Directory eingetragen sind.

ALS[+] <list>, ..., NEXTA
--------------------------
ALS <list>              : ALL-Schleife mit allen Stationen in <liste>
ALS+ <list>             : mit Ext.'+' wird das ECS-LAN Directory nicht beachtet
ALS <list> <selection>  : Einschrnkung gem <selection>, Ext.'+' ist
                          hier nicht mglich.
Hints:
  Syntax of <list>      : {[{<not_alpha>}^]<id>}^{<not_alpha>}^
  Syntax of <id>        : <alpha>[<digit>]
  Example for <list>
        AB1CD8Z3        A:B1:C:D8:Z3    "A:; B1;  CD8, Z3"
- Reihenfolge der Stationen: entsprechend der <list> von links nach
  rechts, Mehrfach-Nennungen werden beachtet.
- Zufhrung der <list> aus der Zwischenablage:          ALS $

ALS_<group>[+] [<selection>], ..., NEXTA
ALS_[+] <group> [<selection>], ..., NEXTA
-----------------------------------------
Statt einer Liste wird hier eine festgelegte Gruppe verwendet. Die jeweiligen
Gruppennamen sind vom Stationstyp abhngig. Die Reihenfolge der Stationen
entspricht der jeweiligen Gruppenliste, Mehrfach-Nennungen werden beachtet.
Beispiel (<group> = PARGR):
ALS_PARGR, ..., NA      : Durchlaufen aller Stationen der Gruppe, sofern sie
                          im ECS-LAN Directory vorhanden sind.
ALS_ PARGR, ..., NA     : alternative Schreibweise. Diese allgemeinere Form
                          ermglicht die Zufhrung von <gruppe> ber die
                          Zwischenablage ($):   ALS_ $
ALS_PARGR+, ..., NA     : Durchlaufen aller Stationen der Gruppe, auch wenn
                          sie nicht im ECS-LAN Directory vorhanden sind.
ALS_+ PARGR, ..., NA    : alternative Schreibweise.

______________________________________________________________________________

Analog Processing
===================

Analog Inputs:
----------------
- Energy is computed from an analog power value with AnaMODE = 2.
- To count pulses select AnaMODE=3. The input status can be queried with INPUT
  {0|1}. The LEVEL command defines the switching threshold:
  0=10%,  1=25% (default),  2=50%,  3=70% of full range.
  PULSEDURATION is used to evaluate input status.
- STARTSTOP influences energy computing in AnaMODE= 2 or 3.
- The input characteristic is selected with AnaMODSEL (device hardware
  must also be configured accordingly):
        0: -10..0..+10 V        1: -20..0..+20 mA       2: -5..0..+5 mA
        3: S0                   4: 4..20 mA (20mA range)
- U1601 makes 12 inputs available at channels 1 through 12.
- U1615 makes a maximum of 7 inputs available at channels 1 through 7.
- REG-D/PAN-D make a maximum of 6 inputs available at channels 1 through 6.

Analog Outputs:
----------------
- U1601 makes 2 outputs available at channels 13 + 14.
- U1615 makes max. 7 outputs (unipolar only) available at channels 1 through 7.
- REG-D/PAN-D make max. 2 outputs available at channels 1 through 6.
- The output characteristic is selected with AnaMODSEL.
  The following applies to U1601 (device hardware may also have to be
  configured accordingly):
        0: -10..0..+10 V        1: -20..0..+20 mA
        4: 4..20 mA (20mA range)
  The following applies to U1615:
        0: 0..+20 mA            1: 4..20 mA (20mA range)
  The following applies to REG-D/PAN-D:
        1: -20..0..+20 mA       4: 4..20 mA
- Mit dem Befehl AnaINT (mit n > 0) wird eine sekundengenaue Schleppzeiger-
  Mittelwertbildung aktiviert. Der Ausgang und ANA (lesend verwendet) liefern
  stets den Mittelwert der zugewiesenen ANA-Werte der letzten n Sekunden.
  AnaINT ist bei U1601/REG-D Versionen ab dem 08.11.99 verfgbar.
- The AnaRESO command has no significance (for U1615 AnaMAX and AnaMIN
  as well), AnaMODE 2,3 is not allowable.

Relay Outputs (U1615 only):
----------------------------
- Only the AnaModID and AnaRelMap commands are valid.
- U1615 makes max. 7 relay outputs (normally open contact) available at
  channels 1 through 7.

General:
----------
- Ext. '?' ( ANA? 1 ) suppresses the error message "Function not available"
  from stations not equipped with analog functions.
- Commands identified with (*) are not available at the U1615.

ANA <channel>                   Analog input, scaled
ANA <channel> = <value>         Analog output
AnaN <channel> [= <value>]      Analog I/O, -1..0..+1 normalized value (*)
AnaR <channel> [= <value>]      Analog I/O, -1..0..+1 rough value
                                per AnaModSel(*)
AnaRS <channel> [= <value>]     Analog I/O, rough value per AnaModSel,
                                +/- range (see AnaSSEL) however
                                not limited (*).
AnaMAX <channel> [= <value>]    Maximum (with timestamp: ANAMAX/ <channel>)
AnaMIN <channel> [= <value>]    Minimum (new timestamp: ANAMIN/ <k> = <w>)
AnaMAXN, AnaMINN                Maximum/Minimum, value range same as AnaN (*)
AnaMAXR, AnaMINR                Maximum/Minimum, value range same as AnaR (*)
AnaMMCLR <channel> = 0          delete Maximum and Minimum (*)
                                (ANAMAX = ANAMIN = ANA, new timestamp)
AnaFACTOR <channel> [= <value>] ana = (normalized_input * FACTOR)+OFFSET
AnaOFFSET <channel> [= <value>]        0 --> 0.0; +/-full range --> +/-1.0

AnaUSEL <channel> [= <value>]   Ana unit, <value>: 0=none, 1=EUnit, 2=PUnit
                                3=AUnit (AUnit not available for U1615)
AnaFIX  <channel> [= <value>]   Fixed decimal for analog value (*)
                                0: 0            1: 0.0          2: 0.00
                                3: 0.000        9:floating decimal
                                (floating decimal for <value> : 4..9)
AnaSSEL <channel> [= <value>]   +/- range limiting (SignSelect),
                                used for normalized, although not for
                                unscaled analog value.
                                <value>: 0= +/-,  1= +,    2= -
AnaRESO <channel> [= <value>]   Resolution in measure points. Default: 2000
AnaINT <kanal> [= <wert>]       Mittelwertbildungsintervall in Sekunden (*)
                                0    : Standard-Momentanwert
                                1..60: Schleppzeiger-Intervall (Analog-Ausgang)
AnaModID <channel>              Module type (read only)
AnaModSN <channel>              Module serial number (read only)
AnaModDC <channel>              Module date code (read only)
AnaModSel <channel> [= <value>] Module I/O characteristics

AnaRelMap <module> [= <relay>]  Mapping of relay modules to relay numbers
                                <relay>                    (U1615 only)
                                0     : Identity
                                1...7 : <module> is mapped to <relay>

AnaT                            Test for Ana activity (U1615 only)
                                Stack: - >>> {0|1}
                                1:Ana active, 0:not. No output.

AnaMODE <channel> [= <mode>]    <mode>  ETOT        PMOM        ANA
                                  0  :  *           *           -
                                  1  :  *           *           ana
                                  2  :  Etot(ana)   ana         ana
                                  3  :  Etot(count) pmom(count) ana/count
                                  4  :  -----------LON--------- ana
                                  5  :  *           *           ana
                                  6  :  -----------LON--------- ana
                                 7+8 :  *           *           ana
                                        ( * : unaffected basic function)

______________________________________________________________________________

BUS  BUSL  BUSR : ECS LAN Status

Outputs the number of devices connected to the ECS LAN:
   Total number,  Number BUS left  (direct neighbors)
                      Number BUS right (...)

Call:   BUS
Stack:  -  >>>  <numer_of_bus_users>
                BUS:  Total number
                BUSL: Number left, or  1 if BUS L error
                BUSR: Number right, or  1 if BUS R error
Ext.:   + - . #

Examples:
  BUS    :  Total bus users = 8, BL= 3(1), BR= 4(4)
  BUS.   :  8;3;1;4;4;0;0   [last two values: L ;R errors (1:error)]
  BUS#   :  8
  BUSL#  :  3

______________________________________________________________________________

CHANNEL (Chan)   : The name of the channel (max. 8 characters)
LONGNAME (LNAME) :  The full name of the channel (max. 20 characters)

Call    :  CHANNEL <enumeration> [=<string>]
Output  :  yes
Buffer  :  <name>
Stack   :  - >>> -
Ext.    :  + - . # $ %

Available Characters:
==============
- All ASCII characters can be used (except for control characters), except for
  the following :  ','  ';'  <blank>
  ',' and ';' are transformed to '_', a <blank> is seen as the end of a string.
  The assignment CHANNEL <enumeration> = "$" does not assign the dollar sign
  to the channel name, but rather the content of the clipboard.
- Channel names can be searched throughout the entire system with the
  following restriction: the 1st character must be a letter.
- In order to assure that the channel names can be used for the dBASE field
  identifiers only '_' may be used in addition to numbers and letters. The
  first character must be a letter.

______________________________________________________________________________

CMODE : Channel-Mode

Call    : CMODE <enumeration> [=<channelMode>]
Output  : yes
Stack   : - >>> -
Ext.    : + - . # $ % ?
                                                ---- possible channels ----
<channelMode>                                   U1601   U1602   U1603
0 : OFF    Off                                  1..64   1..64   1..64
1 : ANA    Analog-I/O (ANA)                     1..14   -       1..6+13+14
2 : P->E   PMOM=ANA --> ENERGY                  1..12   -       1..6
3 : COUN   ANA-PULSE --> ENERGY / PMOM          1..12   -       1..6
4 : LON    LON-Counter --> ENERGY / PMOM        1..64   1..64   1..64
5 : LonA   LON-Analog-I/O (LONANA)              1..64   1..64   1..64
6 : L-PE   like LONA plus LONANA --> ENERGY     1..64   1..64   1..64
7 : LonI   LON binary inputs                    1..64   1..64   1..64
8 : LonR   LON relay                            1..64   1..64   1..64

- CMODE corresponds to the command ANAMODE for analog channels.
  ANAMODE **    : Mode for all analog channels (U1601/2/3: 1..14)
  CMODE **      : Mode for all channels (U1601: 1..64)
- LISTCMODE returns a list of all available CMODEs.
- CMODE is not available for U1600/10/15 (use ANAMODE for U1615),
  The ext. '?' suppresses the error message "syntax error" or "function not
  available".

______________________________________________________________________________

COMLOCK
COM1LOCK
COM2LOCK :  Sperren der COM-Schnittstelle, keine Zeichen werden mehr ange-
==========  nommen. Die Sperre bleibt fr 255s bestehen, falls sie nicht
            zuvor mit COMOPEN aufgehoben oder erneut aufgefrischt wird.
            Beim Empfang des Zeichens ^X (24d) wird die Sperre aufgehoben.
            Nur lokal ausfhrbar.
COMOPEN
COM1OPEN
COM2OPEN :  Freigeben der COM-Schnittstelle. Nur lokal ausfhrbar.
==========

COMDTR   :  Nur verfgbar bei U1600: kurzzeitiges Deaktivieren der
==========  COM1 DTR-Leitung (0.4s). Deaktivieren der DTR-Leitung bis zu
            20 Sekunden (nur bei U1600):        PAUSE@ <seconds>
            Nur lokal ausfhrbar.

- Diese Befehle sind fr Spezialaufgaben gedacht (z.B. Callback via Modem).
- "Nur lokal ausfhrbar" bedeutet, da unabhngig von der Kennungsangabe
  die Befehle nur fr die direkt angeschlossene Station gelten.
- Die COM-Sperre wirkt auf folgende Schnittstelle:
                                ECL interpreter runs on
        Command                 COM1    H-Prog. COM2
        -------------------------------------------------
        COMLOCK/COMOPEN         COM1    COM1    COM2
        COM1LOCK/COM1OPEN       COM1    COM1    COM1
        COM2LOCK/COM2OPEN       COM2    COM2    COM2


Setup of COM-, LAN-, LON- Interfaces:
=====================================
SETCOM1 [= <param> [<dly]]      // serial COM-1 interface
SETCOM2 [= <param> [<dly]]      // serial COM-2 interface
SETCOM3 [= <param> [<dly]]      // COM-3 Extension (if available)
SETLANL [= <param> [<dly]]      // ECS-LAN LEFT
SETLANR [= <param> [<dly]]      // ECS-LAN RIGHT
SETLON  [= <param>]             // LON Network (if available)
SETCOMS                         // Output of all interface settings

Output  :  yes
Buffer  :  Parameter string
Stack   :  - >>> -
Ext.    :  & + - # % $ ?

- die Einstellmglichkeit per ECL ist erst mit Firmware-Versionen ab dem
  16.05.1999 mglich.
- Die Einstellungen mssen mit grter Vorsicht vorgenommen werden, da ein
  Gerte-Verbund bei falscher Einstellung u.U. irreversibel gestrt werden
  kann. Diese Strungen knnen u.U. nur noch lokal per Bedienpanel beseitigt
  werden.
- Damit ECS-LAN und COM Einstellungen ausgefhrt werden knnen, ohne den
  aktuellen Befehl zu behindern, kann ein Delay <dly> in Sekunden angegeben
  werden (0.3s .. 25.5s, Werte kleiner 0.3 --> 0.3s).
  SETLON arbeitet stets ohne Verzgerung (auch wenn <dly> angegeben wird).
- <param> ist der Parameter-String, der keine Leerzeichen enthalten darf.
  Gro-/Kleinschreibung ist unwichtig.
  Die komplette Parametrierung oder nur ein Teil kann angegeben werden, die
  Angaben in Klammern sind alternativ gltig.

SETCOM1,SETCOM2:  mode/baudrate/parity/handshake
----------------
    mode        : OFF, ECL, ECL+HP, DCF77(DCF)
    baudrate    : 110, 150, 300, 1200, 2400, 4800(4k), 9600(9k), 19200(19k),
                  38400(38k), 57600(57k), 76800(76k), 115200(115k)
    parity      : P-, EVEN(PE), ODD(PO)
    handshake   : XON(XOFF), RTS(CTS)

SETLANL,SETLANR:  mode/baudrate
----------------
    mode        : 2D(2W), 2D+(2W+), 4D(4W)
    baudrate    : 62500(62), 125000(125), 375000 (375)

SETLON:           mode
-------
    mode        : OPEN(O)(-), RA50(RT50)(50), RA100(RT100)(100)

Examples:
* Setzen von COM1 auf Standard-Vorgaben (ECL/9600/P-/XON):
        SETCOM1 = DEFAULT
* ndern der Baudrate auf 115200 Baud:
        SETCOM1 = 115k
* ndern der Parity und des Handshakes (PE/RTS)
        SETCOM1 = PE/RTS
* ECS-LAN: ndern der Baudrate einer Line-to-Line Verbindung (hier seien die
  Stationen D:(LAN/R) mit E:(LAN/L) verbunden (2-Draht oder 4-Draht).
  Die Verbindung arbeitet einwandfrei mit 62k5 Baud, die Baudrate soll nun
  auf 125k Baud erhht werden. Sie haben Zugriff auf beide Stationen ber das
  ECS-LAN (via D:LAN/L); damit die Verbindung zu E: nicht abreit, wird die
  Einstellung um 2 Sekunden verzgert.
        D:SETLANR = 125k 2, E:SETLANL = 125k 2
  Nach Ausfhren dieser Zeile werden die Einstellungen nach 2s gltig, die
  Befehle konnten in dieser Zeit garantiert beide Stationen erreichen und
  besttigt werden. Testen Sie nun die Netz-Performance mit SYSTEST.

______________________________________________________________________________

COSTFAC1 COSTFAC2 : Cost factors for tariffs 1 + 2:
=================
Call    :  COSTFAC1 [=<factor>]
Output  :  yes
Stack   :  - >>> <factor>
Ext.    :  + - . # %


TFIX : Fixed Decimal Costs
====
Call    :  TFIX [=<fix>]
Output  :  yes
Stack   :  - >>> <fix>
Ext.    :  + - . # %

______________________________________________________________________________

DCF77 Radio Controlled Clock Synchronization
============================================
The DCF77 radio controlled clock is connected to COM1 or COM2 depending upon
availability. The COM port to which the clock has been connected must be
configured via the RS232 menu (MODE=DCF77). Only one COM port can be set up
for the DCF77 operating mode at any given time. This means that DCF77 cannot
be selected if the other COM port has already been configured for the DCF77
operating mode.

One DCF77 telegram is received per minute. A telegram can generally be verified
based upon the number of bits, and whether or not the parity bits are correct
(--> <DCF_raw_time>). If two identical telegrams are received, the time
information is evaluated as a correct data receipt (--> <DCF_good_time>).

Station time is automatically synchronized after correct data receipt has
occurred. Accuracy is equal to +/- 0.5 second.
Damit ein "Zeit-Jitter", bedingt durch die Synchronisation per DCF oder ZEIT-
Befehl, nicht zu einem Fehlverhalten bei Intervallgrenzen oder Zeitvergleichen
fhren kann, ist ein Verfahren implementiert, da Abweichungen <= +/-3s
strungsfrei verarbeitet. Die <time_since_last_update> wird nichtflchtig
gespeichert, wenn die Systemzeit angepat werden mu, nicht jedoch Gleichlauf.

Compatibility note: U1600/10/15 station time is automatically synchronized
at xhxx:05, 5 seconds past full minute. Deviations <= 1 second are only
corrected once per hour. Accuracy is equal to +/- 1 second. "Time jitter"
can not be balanced.

Despite the radio controlled clock, an H program should be used with the SUWI
command for switching between daylight savings and standard time (see SUWI),
because continuous receipt of synchronizing signals cannot be assured.

Time Synchronization for Several Stations (is run at the station with the
DCF77 clock):
        H 17 = 'IF 0h00:15, ALL-, TIME// = xhx:x x.x.x'

Commands for DCF77 Statistics (stack oriented, no output:
---------------------------------------------------------
  DCF           - >>> <time_since_last_update> <DCF_raw_time> <DCFseconds>
  DCF_          - >>> <time_since_last_update> <DCF_good_time> <DCFseconds>
  DCF*          - >>> <0000FFJJ> <MMDDhhmm> <par> <bit> <DCFseconds>
  DCF@          - >>> <DCF_cycle_in_process>
  DCF@@         - >>> <DCF_receipt_OK_in_the_last_4_minutes>

- <DCF_cycle_in_process> : 1 sec. down counter, set to 70 if a bit is received.
- <DCF_receipt_OK_in_the_last_4_minutes> : 1 sec. down counter, set to 240
  if a correct minute telegram is received.
- Query last update (also see DCFSTATUS):
        DCF,dr 2,time// .


DCFSTATUS (DCFSTAT)  :  Ausgabe der aktuellen DCF77-Zeit sowie Zeitpunkt der
---------------------   letzten Anpassung der Systemzeit.      (U1600: l.a.)
Call    :  DCFSTATUS
Output  :  yes
Stack   :  - >>> <DCF_no_receipt_since_n_minutes>
Ext.    :  + $ ## &

- Liegt der Empfang der letzten gltigen Zeitinformation mehr als 4 Minuten
  zurck, so wird "??:??:nn" angezeigt. Wird die Zeitanzeige in Klammern
  dargestellt, so ist die letzte gltige Zeitinformation lter als 1 Minute.
  Wenn die Sekunden in Klammern gezeigt werden, so wurde ein Parity-Fehler
  erkannt. Die Anzahl der Minuten seit dem letzten korrekt empfangenen
  Telegramm werden in eckigen Klammern angegeben (z.B. "[3m]"), sofern die
  Anzahl grer Null ist (bei U1600/10/15 fehlt diese Angabe).
- Der Zeitpunkt der letzten Anpassung wird solange gespeichert, bis
  entweder eine Zeitanpassung wegen Abweichung erfolgt oder die Systemzeit
  anderweitig verndert wird. Im letzteren Fall wird der Zeitpunkt auf Null
  gesetzt, dargestellt wird "--:--:--".
- <DCF_no_receipt_since_n_minutes> : Anzahl der Minuten seit dem letzten
  korrekt empfangenen Telegramm. Wird bei Reset/Hilfsenergieunterbrechung
  (oder wenn DCF77-MODE nicht ausgewhlt ist) auf Null gesetzt. U1600/10/15
  lieferen stets Null.
  <DCF_no_receipt_since_n_minutes> kann gut zur berprfung des DCF77-
  Empfangs per H-Programm verwendet werden. Beispiel:
        H 20 = 'dcfstat-,300,>,rel 2=.'
  Relais 2 wird eingeschaltet, wenn 5 Stunden (=300 Minuten) lang kein
  korrektes DCF77-Telegramm empfangen wurde.

______________________________________________________________________________

DELIMITER (DELI) (DL) : Adjust the delimiter for the rest of the command line

Call:           DELI  [[<fieldSeparator>][__<recordSeparator>]]
Output  :       no
Stack   :       - >>> -
Ext.    :       * + . #

- DELI without parameters resets to default values:
  <fieldSeparator> = ';'  <recordSeparator> = '\r\n'   [<CR><LF>]
- Both delimiters may contain up to 8 ASCII characters.
- Empty delimiters are also possible: DELI \000 \000            (U1600: l.a.)
- In order to maintain a consistent programming environment, the new
  delimiters apply only to the rest of the command line, after which
  the default values apply again.
- Ext. * reverses the order of parameters: DELI* <recordSep>[__<fieldSep>]
- If only one parameter is stated, the other remains unchanged.
- For ext. '.': <recordSeparator> = <fieldSeparator>            (U1600: l.a.)
- For ext. '#': <fieldSeparator> = <recordSeparator>            (from 02/2002)
- Ext. '+' suppresses the next <recordSeparator> in the output  (U1600: l.a.)
  Please observe that diversion to the clipboard without output
  (with ext. '--') usually includes the first <recordSeparator>, and that the
  desired suppression is no longer possible during output.
  Remedy: divert with extensions (ext. '--+').

Examples:
* Instead of the normal ';' separator, the output destined for the
  dBase command  APPEND FROM ... DELIMITED  should be delimited with ','.
  The "" delimiters are not necessary for dBase (Extension $):
        DELI ","; Etot.$ 1      -->     "Etot",1,"Chan-1",127.34,"kWh"

* Several different values should be delimited for output with semicolons.
  <recordSeparator> = <fieldSeparator> is set and the first semicolon
  is suppressed (Note: Output always begins with <recordSeparator>
  !!,DELI.+,CHAN# 1,MCONST# 1+3,URAT# 1,! Test  -->  channel-1;100;640;1;Test


CHAIN   : Verketten der Ausgaben von Befehlen mit der Doppel-Ext. "##",
========  Aneinanderfgen von Clipboard-Eintrgen.

Call    :       CHAIN           Beginn der Verkettung
                CHAIN-          Ende der Verkettung
Output  :       no
Stack   :       - >>> -
Ext.    :       $

- CHAIN ist verfgbar in Firmware-Versionen ab dem 16.05.1999.
- So einfach die Ausgabe eines kanal-orientierten Befehls mit der Ext. "##"
  von "mehrzeilig" (Werte mit <CR><LF> getrennt) in einzeilig (Werte mit
  Semikolon getrennt) umschaltbar ist, so aufwendig ist die gleiche Ausgabe-
  Form, wenn die Daten von mehreren Befehlen kommen (siehe Beispiel bei DELI).
  Mit CHAIN wird der Ausgabefunktion mitgeteilt, da der Ausgabe-Kopf jedes
  Befehls mit Doppel-Ext. (z.B. "##", ".." oder "%%") nur beim ersten Befehl
  nach CHAIN der <recordSeparator> ist, ansonsten der <fieldSeparator>.
  Die Ext.'+' wirkt nur beim ersten Befehl nach CHAIN.
  Beispiel:
  CHAIN,KANAL## 1,ZKONST## 1+3,URAT## 1,!## Test  -->  Kanal-1;100;640;1;Test

- Nach CHAIN werden alle mit Ext. '--' erzeugten Clipboard-Ausgaben aneinander
  gehngt (Gesamtlnge 128 Zeichen). Ohne CHAIN wird die Clipboard-Ausgabe pro
  Befehl neu initialisiert.
  Die Clipboard-Referenz '$' bezieht sich auf das Clipboard vor Aufruf von
  CHAIN. Bevor also das verkettete Clipboard ausgegeben werden kann, mu mit
  CHAIN- die Verkettung beendet werden.
  Beispiel:
        !-- "one",!-- "two",!$                          -->     two
        CHAIN,!-- "one",!-- "two",CHAIN-,!$             -->     one
                                                                two
- Die Ext. '+' funktioniert, wie oben beschrieben, nur beim ersten Befehl
  nach CHAIN. Um lediglich Strings zusammen zu fhren, wird CHAIN$ verwendet.
  CHAIN$ modifiziert die Ausgabekopfverarbeitung nicht.
        CHAIN,!-- "one",!--+ "two",CHAIN-,!$            -->     one
                                                                two
        CHAIN$,!-- "one",!--+ "two",CHAIN-,!$           -->     onetwo

______________________________________________________________________________

DIR DIRN DIRS : Directory of all ECS LAN users

DIR  [<selection>]   : ID only for all users (A:)
DIRN [<selection>]   : ID and STATION NAME of all users (A:Plant1)
DIRN_                : ID and STATION NAME of the selected station

Output  : yes
Stack   : - >>> -
Ext.    : + - # . %

- DIR with ECS LAN info: see DIRS
- The list of users can be limited by indicating a selection
  <selection> :                                                 (U1600 l.a.)
  *  : all stations (need not be entered)
  #  : all my brothers (identical devices, actual ID context important)
  ## : all my family (REGSys or ECSys, actual ID context important)
ECSys:
  U  : all U16xx stations (AB or BA also possible)
  A  : all U1600/10/15 stations
  B  : U1601 stations
REGSys:
  RP : REG-D and PAN-D (PR also possible)
  R  : REG-D
  P  : PAN-D
  M  : MMU-D
  Q  : PQI-D
  S  : REG-DP
  O  : EOR-D
  T  : REG-TM

- Compatibility note: <selection> {# ## M Q S O T} available from 12/2001
  (RS232 device sufficient).

--------------------
DIRS  [<selection>]  : same as DIR, but with info for each ID:
                     L=left, R=right, + = direct neighbor, * = "I"

Output  : yes
Stack   : - >>> <number of bus users>
Ext.    : + - # . %                                 (ext. '%' for U1600: n.a.)

______________________________________________________________________________

DISPLAY (DD) : Get LCD display

Call    : DISPLAY [<keyboardString...>]     <keyboardString..> : see KEY
Output  : U1600: 3 lines  (1st + 2nd LCD lines + 1 line with status for 8 LEDs)
                 [LAN/L LAN/R R1 R2 R3 R4 STATUS STAT24V]
          U1601: 17 lines (1st-16th LCD lines + 1 line with status for 4 LEDs)
                 [STATUS LAN/L LAN/R LON R1 R2 R3 R4 R5 R6]
          REG-D: 17 lines (1st-16th LCD lines + 1 line with status for 10 LEDs)
                 [STATUS <U >U >I LED1 LED2 LED3 LED4 AUTO HAND]
          PAN-D: 1 line   (1 line with status for 18 LEDs)
                 [BETRIEB STOERUNG <U1 >U2 <<U3 >>U4 LAUFLAMPE PHASENFALL LED1
                  LED2 LED3 LED4 STOERSTUFE STOERREG AUSLOES NOTAUS LED5 LED6]
Stack   : - >>> -
Ext.    : + - # |

- The cursor in the display (U1600 only) is encoded with a preceding '&'.
- Coding of LED/RELAY-line:
  '-' : OFF,  '*' : ON,  other non control characters: ON (reserved)
- Ext. #  : output without "" quotation marks
- Ext. |  : only shows LED line         (U1600: l.a.)
- Ext. || : only shows text lines       (U1600: l.a.)

______________________________________________________________________________

DUP (DU)  DROP (DR)  SWAP (SW)  PICK : Stack manipulations

DUP     : n1 n2    >>> n1 n2 n2
DROP    : n1 n2 n3 >>> n1 n2
SWAP    : n1 n2    >>> n2 n1

DUP  <n>: performs DUP n times
DROP <n>: performs DROP n times
DROP *  : removes all elements from stack (from 12/2001)

PICK <i>: copies the ith stack element to the top. 'PICK 1' == 'DUP'

STKS (STACKS)   : Stack Structure Output (from 12/2001)
================= Print out stack elements as structure (HEX or binary output)
                  and remove them from stack (not with ext.'|').
STKS            : like STKS *
STKS *          : used elements only
STKS **         : all 63 stack elements
STKS <n>        : <n> elements (0, 1..63)
Extensions:
        |       : do not remove elements from stack
        .       : use binary output instead of HEX output
        *       : INTEL instead of MOT
        $       : Print out checksum (4-digit HEX number) at file end
        #  ##   : single output of elements, separated by CR-LF ('#') or
                 ';' ("##"), no checksum possible.
        %  %%   : single output of elements like '#' or "##" with print out
                  of the %-paramter-string prior to each element.

______________________________________________________________________________

dVSUM dVIRT  : Definition function used for creating virtual channels in a
               background H program with differential summation
               (indefinite coupling).

dVSUM   : Generates totals for enumerated channels and stores them to
          intermediate registers
Call    : dVSUM <base_enumeration> [<factor>]
Output  : no
Stack   : - >>> -

dVIRT   : Assigns intermediate register differential sums to one or several
          target channels.
Call    : dVIRT <target_enumeration> [<factor>] =
Output  : no
Stack   : - >>> -
Ext.    : + * |

dVIRT+ ...   :  Calculated energy is added to energy measured at the target
                channel. Measured energy has no effect without ext. '+'.
dVIRT* ...   :  The intermediate registers are normally cleared after DVIRT.
                However, they remain intact if ext. '*' is used.
dVIRT| ...   :  Positive energy quantities / power values are considered only.
dVIRT|| ...  :  Negative energy quantities... (see below).

- DVIRT can be used for all channels, but only one time per channel.
  DVIRT may only be executed in H programs and CANNOT be influenced
  with IF..THEN..ELSE.
- By using a <factor> the partial energy/power value will be multiplied with
  this <factor>. Attention, this <factor> must be completely static, program
  execution may not change it.
- Instantaneous power PMOM for the created channel corresponds to the sum of
  instantaneous power at the base channels. If DVIRT generation is interrupted
  for more than 30s, PMOM is set to zero, or to the RMS measurement value.
  Shorter interruptions DO NOT result in any data loss for energy quantities!
- The sums at the virtual channel are entirely independent of the base channels
  (indefinite coupling). Generated sums can be directly deleted.
- STARTSTOP can be used independently of the base channels for this reason.
- One-time addition of an energy quantity to a channel: see DELTA
- Ext. '|' available from ECSys V2.47, applicable to DVIRT only.
  When using this extension, positive ('|') or negative ("||") energy
  quantities / power values are considered only. Example: a base channel
  has to be splitted in two channels measureing incoming and outgoing energy.
  Limitations: this function will work properly only, if exactly one sum
  channel is used; using multiple sum channels will lead to a permanent
  addition/substraction of small balance differences. In combination with
  Ext. '+' energy quantities and power values of DVSUM/DVIRT will be
  restricted only, directly measured energy at the target channel
  will NOT be restricted.
- Efficiency: Each DVSUM command uses an ECS LAN telegram, regardless of the
  <base_enumeration>. However, the DVIRT command uses one ECS LAN telegram
  per channel of the <target_enumeration>.

Examples:
- Channel 26 from station D: creates a cost center with channels
  1..5+8 at station B: (weighted 0.7) and channel 4 from station C:
  (weighted 0.3):
  H 1 = 'B:DVSUM 1..5+8 0.7, C:VSUM 4 0.3, D:VIRT 26='

- Channel 10 is equal to the balance of channels 1..8 and the total sum of
  channel 9 (sum 1..8 less channel 9):
  H 2 = 'DVSUM 1..8, DVSUM 9 -1, DVIRT 10='

______________________________________________________________________________

DELTA   :  One-time addition of an energy quantity to a channel.

Call    :  DELTA <enumeration> [<factor>] = <value>
Output  :  no
Stack   :  - >>> -
Ext.    :  |

DELTA| ...   :  Positive energy quantities are considered only.
DELTA|| ...  :  Negative energy quantities are considered only.

- STARTSTOP permits assignment (STSP==1) or ignores it (STSP==0).
- The <value> can be weighted with an optional <factor> (U1600: l.a.).
- Ext. '|' available from ECSys V2.47.
- See HTD for an example of the realization of an hours meter.

______________________________________________________________________________

EEINH PEINH AEINH TEINH : Units of measure energy E, power P, analog I/O
                          and of the tariff(max. 4 characters)

Call:           EUNIT <enumeration> [=<string>]
Output  :  yes
Buffer  :  <unit>
Stack   :  - >>> -
Ext.    :  + - . # $ %

- For usable characters, see CHANNEL.
- IN order to be able to use the analog unit of measure, ANAUSEL <chan> = 3
  must be selected.
- AUNIT not available with U1600/10/15, response is an empty string.

______________________________________________________________________________

EINT PINT : Energy and power for interval (data list)

Call:   Eint <enumeration> [<startindex>] [<how_many>]    [=<newValue>]
Stack:  -  >>>  <value>  (with enumerations: <value>=total(individual values))
Ext.  : + - . # / * _ | $ % @

Output starts with <startindex> and is carried out in chronological order
<startindex> no details  --> <startindex>=0
<startindex>=='*'        --> <startindex>=first entry in time

<how_many> no details    --> <how_many>=1
<how_many>=='**' : all entries from <startindex>  (with Eint-0)
<how_many>=='*'  : all entries from <startindex>  (WITHOUT Eint-0)
<how_many> greater than <startindex> : "        "   "   "

- Search for a certain index: see INDEX
- The data list must be formatted for a channel selection (#-enumeration).
  Formatting and format are accessed with the FORMAT command.
- Entries to the data list (except for actual value) are compressed at the
  expense of accuracy (see FORMAT).
- Only EINT## is suitable for rapid data transmission.

Power Optimization:
- PINT@ <enumeration> reads out the mean power value for the currently running
  interval with high accuracy (within the first second), because even
  fractions of a millisecond are taken into consideration. Normal power
  calculation (PINT <enumeration>) always works with full seconds.
  For power optimization, it is important that the data settle in relatively
  quickly at the beginning of the interval, and that they do not demonstrate
  excessive overswing. PINT@ ... should be used for such applications.
  PINT@  may only be used as of version 1.63m with U1600/10/15 stations (even
  for access via ECS LAN).

______________________________________________________________________________

Etot:           Total energy
EtotT1:         Total energy tariff 1
COSTT1:         Costs tariff 1
EtotT2:         Total energy tariff 2
COSTT2:         Costs tariff 2
EtotT1T2:       Total energy tariffs 1 + 2
COSTT1T2:       Costs tariffs 1 + 2
PMOM:           Instantaneous power

Call:   Etot <enumeration> [=<newValue>]
Output: yes
Stack:  -  >>>  <value>  (with enumerations: <value>=total(individual values))
Ext.:   + - . # / * _ | $ %

- Ext. * can be used to output the (calculated) number of pulses instead
  of energy. Example: 'Etot* 1'
  Mconst, Urat and Irat of the corresponding channels are used in the
  calculations (even with virtual channels).
- Ext. | outputs only <value> and <unit>: Etot| 1  -->  123.34 kWh
- <newValue>==0  -->  Time data are also deleted, i.e. FROM time and
  TO time are reset to current time.

Measuring Instantaneous Power PMOM:
==================================
- If the input has been configured as a meter, instantaneous power is
  calculated based upon the interval between the last two pulses. Intervals
  of greater than 65s delete Pmom data. If time since the last pulse is
  greater than the last interval between pulses, it is used as a reference
  for Pmom measurement. PFACTOR is also taken into consideration in the
  calculation of instantaneous power.
- Time data provided along with PMOM ext. '/' or '//' is interpreted
  as follows:
  PMOM// : FROM time :  point in time of last energy change corresponds to
                        point in time of the last meter pulse.
  PMOM/  : TO time :    current time.
- FROM time data (resolution: 1s) is generated based upon LASTUPD (s.u.).
  If resolution < 1s is required, LASTUPD must be used.
  For time spans of greater than 20 days, FROM time=0 (01.01.1990 00:00:00).
- U1600/10/15: PMOM does not provide any usable time data (FROM=0, TO=0).

LASTUPD (LUPD)  : Time duration [s] since last channel update    (U1600: n.a.)
==============
Call    : LASTUPD <enumeration>
Output  : yes
Stack   : -  >>>  <value>    (for enumerations <value>=sum(individualValue))
Ext.    : ! + - . # %

- Time from the last channel update (energy change) to now can be determined in
  seconds (resolution: 1 ms).
- The maximum time span is 20 days. The following applies to longer time spans:
  <value> = 1728000 s == 20 days.
- For channels which are not equipped with time span calculation: <value> = 0.

______________________________________________________________________________

                at interval   per day         per month         per year
Energy:         (see Eint)    Eday            Emon              Eyear
Mean Power:     (see Pint)    Pday            Pmon              Pyear

Max. Energy:    Emax (10 ea.) Eday            EmMon             EmYear
Mean Power:     Pmax (10 ea.) PmDay           PmMon             PmYear

List length:    variable      10+current day  12+current month  2+current year

Call    :  Eday <enumerationChannel> [<enumerationIndex>]  [=<newValue>]
Output  :  yes
Stack   :  -  >>>  <value>    (for enumerations: <value>=sum(individualValue))
Ext.    :  + - . # / * _ | $ %

- <enumeration index>=0 or no entry: current cycle
- <new value>=0         -->  time data are also deleted (FROM=0,TO=0)
- EMAX <..> <index>=0   -->  Delete as of <index> to <maxIndex> (EMAX only)
- Variable start of day / month / year: DAYBEG  MONBEG

______________________________________________________________________________

ENUM (AUFZ) : Returns list with the channel numbers included in <enumeration>
====
Call    : ENUM <enumeration>
Output  : yes
Ext.    : + - # %
Stack   : - >>> <number of elements>

- Range of <enumeration> 1..64 or 0..63
- See PARAMETERS for <enumeration> examples.

ENUM@  : pushes enumeration number on to stack
=====     (1 bit per channel --> 2*32 bits)
Call    : ENUM@ <enumeration>
Output  : no
Ext.    : @
Stack   : - >>> <enumNo_33_64> <enumNo_01_32>

- Commands which accept enumerations may pop with the special stack reference
  ".." both stack values <enumNo_33_64> and <enumNo_01_32> from the stack.
  Example:      ENUM@ 1..4, ETOT ..
- first bit (LSB) --> channel 1, bit 32 --> channel 32 in <enumNo_01_32>,
  bits 33-64 located in <enumNo_33_64>.
- U1600/10/15 know enumerations with 32 bits only (0..31 or 1..32), and
  one element only is exchanged via the stack. Please see next table for
  exact stack relations. It does not matter which station type is called,
  but which station type is used for direct RS232 access.
  Command:   Stack U1600/10/15:         Stack U1601/2/3/...:
  -------------------------------------------------------------------------
  ENUM@    : - >>> <enumNo_01_32>       - >>> <enumNo_33_64> <enumNo_01_32>
  ETOT ..  : <enumNo_01_32> >>> -       <enumNo_33_64> <enumNo_01_32> >>> -

- Range of <enumeration> : 1..64
- Commands which anticipate enumerations as of zero (PLIST, ALIST...),
  interpret the <enumeration number> with a channel offset of 1. The
  ext. '@' or explicit enumeration as of zero requires correct bit positions:
  ENUM@@ 2..4, PLIST .. : lists P-Prog. 2..4
  ENUM@ 2..4, PLIST ..  : lists P-Prog. 1..3
  ENUM@@ 0..4, PLIST .. : lists P-Prog. 0..4
  ENUM@ 0..4, PLIST ..  : lists P-Prog. 0..4

______________________________________________________________________________

LOESCHKANAL (ERACHAN)    : Delete all readings for a given channel
--------------------      (except for the data list without EINT-0)
Call:   ERACHAN = <channelEnumeration>


ERALIST : Erase period readings list starting with index.
--------------------
Call:   ERALIST = <fromIndex>   : erase including <fromIndex> .. end
        ERALIST = *             : whole list

______________________________________________________________________________

ECL Interpreter Error
======================
ERR     : Output error status for H background programs
---
Call    : ERR
Output  : yes
Stack   : - >>> -
Ext.    : _     (suppresses the message "No error in ..")

LERR    : Last Error, error number of last execution of the current
----      H program
Call    : LERR
Output  : no
Stack   : - >>> <n>      <n> : Error number (s.u.) or 0 (no error)

LBERR   : Last Bus Error; same as LERR, but only ECS LAN relevant errors
-----     are indicated (otherwise 0).

ERRNR   : Read-out of a description for an error number
-----
Call    : ERRNR <enumeration>              ERRNR
Output  : yes
Stack   : -  >>>  -                       <ErrNr>  >>>  -
Buffer  : Error description(ErrNo.)
Ext.    : + - . #  $ %

- ERRLIST (U1600: l.a.) corresponds to ERRNR


Station Error
===============
ERRSTAT         : Query current station error status            (U1600: l.a.)
-------
Call    : ERRSTAT [<error_mask_enum>]
Call    : ERRSTAT@ [<error_mask>]
Output  : yes
Stack   : - >>> <error_word>
Ext.    : _     (suppresses the message "No error in ..")

- Entry of the error to be displayed via enumeration: <error_mask_enum>,
  32 bit numeric entry (LSB set: view error 1...): <error_mask>
- No entry of [<error_mask_enum>] or [<error_mask>] : ALL errors
- Only the following errors are recognized for U1600/10/15:
  8: internal bit error, 11: Uv failure, 21: LAN/L error, 22:LAN/R error

ERRSTATLIST     : List of all possible station errors           (U1600: l.a.)
-----------
Call    : ERRSTATLIST <error_nr_unum>           ERRSTATLIST
Output  : yes
Stack   : -  >>>  -                             <error_nr>  >>>  -
Buffer  : Error description (error_no.)
Ext.    : + - . #  $ %

Channel Error
============
ERRCHAN         : Query current channel error status            (U1600: l.a.)
-------
Call    : ERRCHAN <channel_enum> [<error_mask_enum>]
Call    : ERRCHAN@ <channel_enum> [<error_mask>]
Output  : yes
Stack   : - >>> <error_word>    (dependent upon all <error_word>s)
Ext.    : _     (suppresses the message "No error in ..")
          *     (error output for all channels together, not separately)

- Entry of errors to be displayed per enumeration: <error_mask_enum>,
  32 bit numeric output (LSB set: view error 1...): <error_mask>
- No output of [<error_mask_enum>] or [<error_mask>] : ALL errors
- To list all channel errors system-wide use: "ALL, ERRCHAN&_ *"
  One telegram is used per channel, that means m devices with 64 switched-on
  channels will need m*64 telegrams.
- Speed up ERRCHAN requests for all channel errors by using device-specific
  enumeration "*ERR", available from V2.45:
        ALL, ERRCHAN&_ *err
  All U1601/2/3 devices within the ECS-LAN need firmware V2.45 or higher,
  otherwise "*ERR" results in an empty list for older devices.
- ERRCHAN* (ext.'*') uses one telegram only to show all channel errors
  regarding the given error mask, but no channel information is available (=0).
- U1600/10/15 always indicate "no errors".

ERRCHANLIST     : List of all possible channel errors           (U1600: l.a.)
-----------
Call    : ERRCHANLIST <channel_enum> <error_nr_enum>
Stack   : -  >>>  -
Call    : ERRCHANLIST <channel_enum>
Stack   : <error_no.>  >>>  -

Output  : yes
Buffer  : Error description(error_no.)
Ext.    : + - . #  $ %

______________________________________________________________________________

EXIT    : Premature ending of current program.

Call: EXIT


RETURN  : Premature ending of current sub-program only.
RET     : abbreviation for RETURN

Call: RETURN

______________________________________________________________________________

Fixed Decimal Setting:  FIX  FIXE

               Stack:
FIX     :     n  >>>  -   fixed decimal representation, n=number of places
                          to the right of the decimal.
FIXE    :     n  >>>  -   exponential representation, n=number of places
                          to the right of the decimal.(U1600: l.a.)
- FIX or FIXE are valid for the rest of the lines.
- FIX n with n >= 7 switches to floating point representation with up to n
  decimal places. Default: n=7.(U1600: floating point as of n>=9, Default: n=9)
- FIX also accepts negative arguments: the number is rounded to the amount of
  the indicated digit, and is displayed with floating instead of fixed decimal
  point (U1600: l.a.).
- FIX / FIXE allow for the entry of a parameter (the stack remains unchanged):
  FIX <n>   ==   <n> , FIX
- Exponential representation with FIXE always has a fixed width (dependent upon
  the number of decimal places), and a plus or minus sign is always entered as
  either + or - with the ext. '+'.
Examples for FIX:       12.345, FIX 0, !   -->  12
                        12.345, 2, FIX, !  -->  12.35
                        12.345, FIX 5, !   -->  12.34500
                        12.345, 9, FIX, !  -->  12.345
Examples for FIXE:      12.345, FIXE 2, !  -->  1.23E+01
                        12.345, FIXE+ 3, ! -->  +1.235E+01
                        -12.345, FIXE 3, ! -->  -1.235E+01

______________________________________________________________________________

FORI I NEXTI (NI)  :  Program loop with numeric variable I
FORJ J NEXTJ (NJ)  :  Program loop with numeric variable J
FORK K NEXTK (NK)  :  Program loop with numeric variable K  (U1600: l.a.)

Each sub-program has its own set FORI/FORJ.

Call    : FORI                  FORI <enumeration>      I          NEXTI
Output  : no                    no                      no         no
Stack   : <from> <to> >>> -     - >>> -                 - >>> I    - >>> -

Notes:
- The loop is executed at least once. At the end of the loop (NEXTI at the
  end of the line) I is increased by 1, or is set to the next enumeration
  element. When no more elements remain in the enumeration, or where:
  I > <to>, the loop is no longer executed.
- The numeric variables are always available and can be set to a specific
  value (e.g. I = 15), however, a "FORI <enumeration>" loop CANNOT be effected
  with an assignment for I.
- Each sub-program has its own FORI / FORJ / FORK set.
- If no more commands are issued after NEXTI, NEXTI can be omitted.
- <enumeration> can encompass a range of 0..63 or 1..64.
- FORI*  :  Reversal of the sequential processing order

Example:        ! Test:, 2,5, FORI, i, !+ " " ., nexti
  or            ! Test:, FORI 2..5, i, !+ " " .
  or            ! Test:, FORI 2..5, i, !+ " %ai"
Output:         Test: 2 3 4 5

Reversal:       ! Test:, FORI* 2..5, i, !+ " %ai"
Output:         Test: 5 4 3 2

______________________________________________________________________________

FORMAT  :  Formats the data list (queries data with EINT)

- The formatting process organizes the memory for a certain number of
  channels - however, the total depth of memory is dynamically related to
  the length of the synchronizing period. If the memory is full, data
  is rotated: the oldest entry is erased to make room for the newest.
- The data list is reformatted (using erase) only if an <enumeration> is
  assigned to the FORMAT command. Without the assignment, FORMAT outputs
  the current formatting, and the stack receives the number of channels
  which can be stored.
- Any enumeration is possible (even with virtual channels).
- Entries to the data list (except for the current values) are compressed to
  a 2 byte value at the expense of accuracy.
  The data range can be flexibly encoded as of ECSys V1.60, in order to adapt
  the working range in an ideal fashion (see below).
  Attention: older ECSys versions do not understand the new encoding formats!
- The following applies upon delivery of the instrument: FORMAT = 1..64 0

Call    :       FORMAT
Stack   :       - >>> <number_of_channels>>
Call    :       FORMAT@
Stack   :       - >>> <coding > <number_of_channels>>
Output  :       Formatting info (without . and # ##), and list of channels
Ext.    :       + - . # ## @

Call    :       FORMAT = <enumeration>  Formatting according to channel
Stack   :       - >>> -                 enumeration and current coding.

Call    :       FORMAT = <enumeration> <coding> Formatting with predefined
Stack   :       - >>> -                                 coding

Data Range Coding: (0: standard resolution indicated in [])
==============================
0 :     0...+/-0.8191[0.0001]...+/-81.91[0.01]....+/-8191[1]...+/-819100[100]
1 :     0....+/-8.191[0.001]....+/-81.91[0.01]...+/-819.1[0.1]...+/-8191[1]
2 :     0....+/-16383[1].......+/-163830[10]
3 :     0......+32767[1].........+327670[10]
4 :     0..+/-99999999 [8 decimal places, smallest place: 1E-6]
        if number > 99999999 then leading digits will be cut off.
        1234567890      -->     34567890    cut first two digits
        12345678.9      -->     12345679    5/4 rounding of 8th decimal place
        1234567.8       -->     1234567.8   no limitation
        12.345678       -->     12.345678   no limitation
        12.3456789      -->     12.345679   5/4 rounding of 8th decimal place
        1.23456789      -->     1.234568    only 6 fractional digits(see below)
Hints:
- Codings 0,1,2,3 use 2 bytes per entry, the coding 4 however uses
  4 bytes per entry, storage duration will be halved in this case.
- Coding 4 is available from V2.46, data list with coding 4 can not be
  read from other devices with older firmware!
- With coding 4 smallest resolution is 1E-7, quick output (Ext. '#') reduces
  resolution to 1E-6 (corrects to 6 fractional digits).

Coding Test:
------------
Call    :       DLVAL <w> [<dlcode>]                            (U1600: l.a.)
Output  :       yes
Stack   :       - >>> <w_compressed>

______________________________________________________________________________

FROM   TO       : Query time number of last output "with time".
DURATION (DUR)  : Duration of time FROM .. TO in seconds.

Call  : FROM
Output  : no
Stack   :  - >>> <timeNumber>   <timeNumber> : seconds count from 1.1.1990

- The two variables FROM and TO are set as soon as a corresponding command
  with ext. / or ^ is used. The period of time which elapses between
  FROM..TO can be determined in seconds with DUR.

Format possibilities for time and date entries for read-outs including time
==========================================================================
Use of the extensions '/' and '^' :
 /      :  ^        : Output with time "to"
 //     :  ^^       : Output with time "from--to"
 ///    :  ^^^      : Output with time "from"
 ////   :  ^^^^     : Suppress output (TO and FROM are nevertheless set)

Modification of output defined by / or // or /// (/ always precedes ^):
 /^     : output time/date instead of date/time      31.12.93;17:33:56
 /^^    : output date/time, date in DBase format yyyymmdd 19931231;17:33:56
 /^^^   : output time/date, date in DBase format yyyymmdd 17:33:56;19931231
 /^^^^  : date/time sep.';' --> ' ' (suitable for MS-EXCEL) 31.12.93 17:33:56
 /^^^^^ : time/date sep.';' --> ' ' (  "        "       "  ) 17:33:56 31.12.93

______________________________________________________________________________

H 0 .. H 31  :  Execute / program background H programs

H 0 .. H 31 are executed in the background one after the other. Run time errors
may be flagged with ERR. Output from the background programs is always sent to
COM1 at the station on which the background program is running.

Call    :       H <enumeration>  [=<string>]
Output  :       no              (yes for named ext. except '-' and '?')
Buffer  :       <program>       (except during execution)
Stack   :       - >>> -         (except with ext. '?', s.u.)
Ext.    :       + - . # $ ! % ?

- H without <index> == H 0,   H1..H31 == H 1..H 31,   H5! == H! 5
- No program extension occurs with extension.
- Maximum number of linked programs: 10, maximum line length: 128
- H 19 is the "print program" and is activated at the operating panel.
  H 19 only runs in the background when activated and not at other
  times (U1600 only!).

- H? pushes the number (0..31, -1:pause) of the current H program to the stack.
  This function may only be executed from within H programs.
- H?? pushes following to the stack: 1= Focus H program, 0= Focus command line.
  It can thus be determined if a program is executed as an H program.

List H Programs
=====================
HLIST                   : list all H programs, corresponds to:  H! *
HLIST <enumeration>     : corresponds to:  H! <enumeration>
HLIST*                  : list all non-empty H programs (U1600: l.a.)

* Copy from H 7 to H 13    :    h- 7,H 13=$     or      h7-,h13=$
* Copies all H programs to station B  : fori 0..31, i,h- ., i,B:h .=$

Interrupt H Programs
========================
HBREAK          : Interruption and 16 s pause for H programs
HBREAK+         : same as HBREAK, but pause duration is 32s (HBREAK++ : 60s).
HBREAK-         : End interruption to H programs immediately (U1600: n.a.)

______________________________________________________________________________

Selective querying of time and date, result to the stack:
HH      :  Hour         (0..23)
MM      :  Minute       (0..59)
SS      :  Second       (0..59)
DAY     :  Day          (1..31)
WDAY    :  Weekday      (1: Monday  .. 7: Sunday)
MON     :  Month        (1..12)
YEAR    :  YEAR         (90..99,0..78)
YEAR*   :  YEAR         (1990..1999,2000..2078)

Call    :  HH           : basis = system time
Output  :  no
Stack   :  - >>> <hourNumber>
Ext.    :  ! _

Call    :  HH .         : basis = second number from stack
Output  :  no
Stack   :  <secNumber> >>> <hourNumber>
Ext.    :  ! _

Meanings of the Extensions:
- The ext. '!' forces an output:
  A number is displayed for HH!, MM!, SS!, DAY!, YEAR!, for
  WDAY! : name of day
  MON!  : name of month
- The ext. '_' accesses the operating hours counter instead of real-time when
  queried without an argument (U1600: l.a.).
- Ext. '-' or "--" : The number or the response is saved to the clipboard.
  No output ensues.

Time Reference:
- All above listed commands used WITHOUT an argument make reference to
  real-time for the station at which the command is physically interpreted
  (as if the ID AA: were always selected). See also ID and TIME.
  If time at a given station is nevertheless to be used as a reference,
  proceed as follows:
    C5:time-,SS! .      : reads out seconds (0..59) for station C5:

Examples:
- Other definition for weekday numbers (0:Sunday .. 6:Saturday):
    WDAY,7,MOD, !
- Second number of current day:
    TIME-,86400,MOD, !
- SS command "on foot" written:
    TIME-,86400,MOD,60,MOD, !
- MM commands "on foot" written:
    TIME-,86400,MOD,3600,MOD,60,/,INT, !

______________________________________________________________________________

ID (KENN) :  station ID as number on the stack   (set ID with SETID)
=========
Call    :  ID
Stack   :  -  >>>  <currentIDnumber>
Call    :  ID <IDnumber>
Stack   :  -  >>>  <IDnumber>
Output  :  no (without ext.), yes (with ext.)
Stack   :  -  >>>  <IDnumber>
Ext.    :  ! + - . # %

- ID to ID number relationship:
  A: 1, A1: 2, ... B: 11, C: 21, ... Z4: 255
- Transformation of an ID --> ID number:        <ID>:ID#
- Transformation of an ID number --> ID:        ID! <IDnumber>
- See ID for further information concerning IDs.

Example:  z4:ID, !      ID! 21        ID. 21        ID# 21
           255             C:           C             21

Influence of Extension '&' on General Command Output:
=========================================================
 &        : output ID at start of line. Etot& 1   --> A:Etot....
 &#       :   <ID>:<val1>                       Etot&# 1  --> A:123.4
 &#.      :   <ID>;<val1>                       Etot&#. 1 --> A;123.4
 &.       :   <ID>;<val1a>;<val1b>;...          Etot&. 1  --> A;Etot;1;...
 &&       : output ID at start of line and before each output block.
 &&##     :   <ID>:<val1>;<ID>:<val2>;...
 &&##.    :   <ID>;<val1>;<ID>;<val2>;...
 &&..     :   <ID>;<val1a>;<val1b>;..;<ID>;<val2a>;<val2b>;..

______________________________________________________________________________

IF  ELSE  ENDIF (EIF)  : Program Branching Commands
The IF command takes an element from the stack and rounds it to the next whole
number (5/4). If it is not equal to zero, the commands between IF and ELSE are
processed. If it is equal to zero, the optional section between ELSE and ENDIF
is executed.

Call    : IF                            ELSE            ENDIF
Stack   :  <condition> >>> -            - >>> -         - >>> -

- Each sub program may have up to four levels.
- If there are no more commands after ELSE or ENDIF, these commands
  may be omitted.
- If the section between IF and ELSE is executed only once following the
  occurrence of a true condition, then use IFF (see IFF).
- See TIMECOMPARISON for the use of IF with time comparison.
- EIF is the abbreviated form for ENDIF.

Example of "condition fulfilled":
    1, IF, PRINT "This section is executed", ELSE , PRINT "but this is not"
Example of "condition NOT fulfilled":
    0, IF, PRINT 'No', ELSE , PRINT "YES", endif; PRINT "Yes/No ready "

______________________________________________________________________________

IFF  .. ELSE ENDIF  : Program branching commands for one-time only execution

The command IFF is used in cases where, unlike IF/ELSE/ENDIF, the section
between IF and ELSE or ELSE and ENDIF is only executed ONCE following
the occurrence of a true condition.
An internal permanent flag (IFF) is kept automatically for each background
H program, as well as a temporary flag (IFF+), which is always initialized
during power on. In H programming, both flags are initialized. The IFF and
IFF+ commands can thus be used only once in an H program (with its P sub-
programs).

Call    :       IFF                     ELSE            ENDIF
Stack   :       <condition> >>> -       - >>> -         - >>> -
Ext.    :       +  (IFF+ flag is always initialized after power on)

- See TIMECOMPARISON for the use of IFF with time comparison.
- The IFF comparison can also be executed outside of an H program, but neither
  of the flags recognize hysteresis. They are initialized when the program
  is started.

Example:
  If +24V are applied to input 8, Etot is read out for channels 1..4
  once, and the time is read out when voltage has returned to 0V.
        H 10 = 'IN- 8, IFF,  time,!+ ":ON",  ELSE,  time,!+ ":OFF"'

______________________________________________________________________________

INDEX   : Calculation of an index for the data list

Call: INDEX *
Stack:  - >>> 'index of the first entry'

Call: INDEX **
Stack:  - >>> 'maximum possible number of entries'

Call: INDEX <as of date/as of time> [<as of time >]
Stack:  - >>> 'index for search time'
Ext.:    +    : index for search time - 1 (prevents overlapping)
        //   : "from" time is searched for instead of "to" time
Example:      INDEX 17.03 12:15, eint##/ 1..4 . *

- The validity of the INDEX number can be guaranteed for the command
  following the INDEX command (in the same line), regardless of whether a
  period transition has occurred in the meantime (validity up to 0.3 s).
- Period transitions during an EINT command do not affect data output.

______________________________________________________________________________

INDIR   : checks if an ID is present in the directory (Dir).

Call    : INDIR
Output  : no
Stack   : <IDno>  >>>  (1: <IDno> in DIR / 0: not available)

Call    : INDIR <IDno>
Stack   : - >>>  (1: <IDno> in DIR / 0: not available)

Call    : INDIR*
Stack   : -  >>>  (1: "current" ID in DIR / 0: not available)

- ext. '-' ignores prompt station as with ALL- (U1600: l.a.).

Example:
* Once station G3 is in the ECS LAN, "G3 in Network" is displayed for 10s
  at all LCDs:
    <A> H=' G3:indir*, iff, all, meld "G3 in Network" 10
* The ALL loop command is included for demonstration purposes:
    'ALL, ....... , NEXTA, ...'   corresponds to:
    '1,255,fori,i,indir .,if,i,an:, ....... , endif,nexti, zz:, ...'

______________________________________________________________________________

INPUT (IN)  :  Read in input status

Call: IN <enumeration>
Stack:  - >>> (1: 24 V present, 0: 0 V present)
Ext.:    + - . # %

______________________________________________________________________________

INTERVAL (ITV)  : Synchronizing period

Call    : INTERVAL [=<duration>]                <duration> : 10 s .. 999 h
or      : INTERVAL [=<number>__<unit>]  <unit> : s | m | h
                                                (without <unit> : seconds)
Output  : yes
Stack   : - >>> <durationinSeconds>
Ext.    : + - . # | %

Example: INTERVAL =15 M   or   INTERVAL = 35s

- Parts of hours or minutes must be converted: 1h30 --> 90m or 5400 s. For
  output, the largest unit of time is always used.
- See also INTERVALSOURCE and SYNC

______________________________________________________________________________

INTERVALSOURCE (IS)    : Source for generation of the synchronizing interval
TARIFFSOURCE     (TS)    : Source for generation of the current tariff
                          T1 or T2

Call:   IntervalSource [=<source>]
Output  : yes
Stack:  - >>> <sourceNumber>
Ext.    : + - . # $ %

                <source>                <sourceNumber>
INTERVAL  :     1 .. 12                 1 .. 12         (U1600: 1 .. 24)
                C  |  Channel           11 (U1601),     23 (U1600)
                T  |  Time              99
                P  | Channel            100
TARIFF    :     1 .. 12                 1 .. 12         (U1600: 1 .. 24)
                K  |  Channel           12 (U1601),     24 (U1600)
                P  |  Program           100

Examples:
Example : Tariff of channel 17  :       TARIFFsource = 17
          Time dependent period :       IQ = T

______________________________________________________________________________

KEY(TT)  : Transfers keystrokes to the operating panel

Call    : KEY <keySequence>
Output  : none
Stack   : - >>> -

Elements of <keySequence>, maximum length, 20 elements:
   1 .. 5 : F1 .. F5
        + : up arrow
        - : down arrow
        < : left arrow
        > : right arrow
        m : Menu
        s : Setup       (same as "press Menu key for 1s")
        # : Enter
        ! : ESC
        a : AUTO        (REG-D only)
        h : HAND        (REG-D only)
        r : LR          (REG-D only "LOCALREMOTE")
        t : ACK         (PAN-D only "TEST/ACKnowledge")

        q : ESC-ESC (return to first level, U1600/10/15 n.a.)
        u : Switch (U1600 only, same as "press up and down
        arrow keys simultaneously")
        l : Enter delete menu or similar function
        x : Set basic status (normal display with Etot, channel 1)

Example  : KEY x++++4
x sets the operating panel to normal display, 4 x '+' moves to channel 5.
  4 stands for F4, i.e. switch to Pmom.


LOCKKB, LOCKKBM : Sperren der Tastatur (auch selektiv)          (U1600: n.v.)
======================================================
Die gesamte Tastatur oder nur bestimmte Tasten knnen auf Timeoutbasis
gesperrt, d.h. der Sperrbefehl ist nur eine bestimmte Zeitdauer gltig,
danach wird die Sperre sicherheitshalber wieder aufgehoben. Verwendet
werden die Befehle vorwiegend in H-Programmen.

LOCKKB : Sperre der kompletten Tastatur
---------------------------------------
Aufruf  :  LOCKKB [= <sperr_dauer>]             <sperr_dauer>
Ausgabe :  ja                                   0    : Sperre aufheben
Stack   :  - >>> <verbleibende_sperr_dauer>     1    : 5s sperren
                                                2..60: Sperrdauer in [s]
- Wird trotz Sperre eine Taste gedrckt, erscheint kurzzeitig die Meldung
  "TASTATUR GESPERRT" im Display.

LOCKKBM : Selektives Sperren der Tastatur (mit Tastenmaske) fr 60s
-------------------------------------------------------------------
Aufruf  :  LOCKKBM [= <sperrmaske>]
Ausgabe :  ja
Stack   :  - >>> <sperrmaske>

<sperrmaske> :  Taste   Bit     Taste   Bit     Taste   Bit
                -------------------------------------------
                F1      0       LINKS   8       SETUP   16
                F2      1       ENTER   9       LOESCH  17
                F3      2       MENU    10      X       18
                F4      3       ESC     11      ESCESC  19
                F5      4       AUTO    12      ACK     20
                AUF     5       HAND    13      -
                AB      6       LR      14      -
                RECHTS  7       <meld>  15      -

- Bitpositionen: (MSB)Bit-31 .. Bit-0(LSB)
- Bitwert:  1=Taste gesperrt, 0=Taste mglich;
  Bei <meld> gilt  1="TASTATUR GESPERRT"-Meldung erscheint, 0=keine Meldung.
- Masken knnen in binrer Schreibweise ("0b" voranstellen) verstndlich
  formuliert werden.
  Beispiel: Sperren der Tasten AUF + AB, Meldung bei Verwendung dieser Tasten:
        LOCKKBM = 0b1000000001100000    oder
        LOCKKBM = 32864

______________________________________________________________________________

CHANNEL (Chan)   : The name of the channel (max. 8 characters)
LONGNAME (LNAME) :  The full name of the channel (max. 20 characters)

Call    :  CHANNEL <enumeration> [=<string>]
Output  :  yes
Buffer  :  <name>
Stack   :  - >>> -
Ext.    :  + - . # $ %

Available Characters:
==============
- All ASCII characters can be used (except for control characters), except for
  the following :  ','  ';'  <blank>
  ',' and ';' are transformed to '_', a <blank> is seen as the end of a string.
  The assignment CHANNEL <enumeration> = "$" does not assign the dollar sign
  to the channel name, but rather the content of the clipboard.
- Channel names can be searched throughout the entire system with the
  following restriction: the 1st character must be a letter.
- In order to assure that the channel names can be used for the dBASE field
  identifiers only '_' may be used in addition to numbers and letters. The
  first character must be a letter.

______________________________________________________________________________

LEVEL   : Sets input sensitivity at the meter inputs.
          Switching threshold:  0=10%, 1=25% (default), 2=50%, 3=70% of
          full range.

Call  : LEVEL [=<value>]
Output  : yes
Stack   : -  >>>  <value>       (only when reading)
Ext.    : + - %                 <value> :  0 (Lo) ... 3 (Hi), default: 1

- The level setting applies to all meter inputs.
- Level l recognition has an accuracy of 5% and an
  hysteresis of 1% of full range.

- Other assignments apply to U1600 stations:
  The maximum H input level (without hysteresis) can be set within a range of
  approximately 3 Volt (Lo) and 5.5 Volt (Hi) (typical).

______________________________________________________________________________

LON specific commands (always begin with Lon...)
================================================

LON MEASUREMENT DATA:
---------------------
LonCR <c>               : Meter reading at the LON meter
LonE <c>                : Energy at the LON channel
LonP <c>                : Instantaneous power at the LON channel
LonANA <c>              : Optional analog value at the LON channel

LON PARAMETERS:
--------------
LonCHANnel <c>          : Sub-channel selection for the LON channel
LonFACTOR <c>           : Optional weighting factor
LonOFFSET <c>           : Optional weighting offset
LonSTOP <c> [= <w>]     : LON channel activity; <w>:  1=stop, 0=run

LonPOLLDELay [= <w>]    : Polling delay [ms];  <w> : 0..32767   (default=0)
LonSTATTIMing [= <w>]   : Station timing code; <w> : 0..15      (default=9)
LonSUBNODE [=<s_n>]     : Read and write of LON SUBNET and NODE Address
                          <subnet_node> : SxxxNyyy
                          xxx : SUBNET Address (1..255)
                          yyy : NODE Address (1..127)
                          Example: LonSUBNODE = S22N003

LON RELAY and INPUTS:
---------------------
LonRel <c> [<bit>] [= <w>]      : access to LON relays
LonInp <c> [<bit>] [= <w>]      : access to LON inputs (binary)


GENERAL LON (query only):
-------------------------
LonVER                  : Version of the U1601 LON EPROM
LonUSERS                : Number of active LON users
LonUSE <c>              : 1=LON channel active (run), 0=not active
LonUSE* <k>             : 1=LON channel active (run or stop), 0=not active
LonTYPe <c>             : Device type at LON channel
LonMAXCHANnel <c>       : Number of available sub-channels,
                          if LonUSE==0, LonMAXCHANnel=16
LonSHOWCR <c>           : 1=show LonCR, 0=do not show LonCR
LonNEW <c>              : New installation of the LON channel

Notes:
------
- Alle LON-Befehle beginnen mit Lon..., gefolgt von max. 9 Buchstaben.
  Die GROSS-geschriebenen Buchstaben mssen verwendet werden, die kleinen
  Buchstaben AM ENDE des Befehls knnen weggelassen werden.
- Typisch englische Befehle werden in [eckigen Klammern] genannt, englische
  und deutsche Befehle knnen beliebig gemischt werden, unabhngig von der
  eingestellten Dialogsprache.
- Bei einem Kommunikationsfehler mit dem LON-Knoten werden die oben genannten
  LON-MESSDATEN nach dem 6. erfolglosen Kommunikationsversuch auf Null gesetzt.
- Bei der Ansprache von Relais oder Inputs kann bitweise (bei Angabe des
  <bit> Parameters) oder auf das ganze Wort zugegriffen werden.
  <bit> : Bitnumber with 1=LSBit, 32=MSBit
  Example: Relay 1..4 are activated with one command, later Relay No. 2 will
  be deactivated (Lon relay module: channel 36).
        LonREL 36 = 0b1111      or      LonR 36=15
        LonREL 36 2 = 0

Syntax Description for Several Typical Lon Commands
=================================================

LonID   : Query / enter the LON Neuron ID for the LON Node
--------
Call    : LONID <channel> [=<lon_id>]
Output  : yes
Buffer  : <lon_id>
Stack   : - >>> -
Ext.    : + - # . %  ?

- <lon_id> : 12 digit hexadecimal numeric string
- Example : LONID 1 = 01002a201F00

LonSTOP : LON channel activity (run or stopped)
--------
Call    : LONSTOP <channel> [=<value>]
Output  : yes
Stack   : - >>> <value>                 <value> : 0=run, 1=stopped
Ext.    : + - # . % ?

LonCR   : Meter reading at the LON meter
--------
Call    : LONCR <channel>
Output  : yes
Stack   : - >>> <value>
Ext.    : + - # . % ?

- If a communications error should occur at the LON node, the listed values
  are set to zero after the 6th unsuccessful communications attempt.

______________________________________________________________________________

MENUAPP MENUAPPN : Defining Menu Applications
=============================================
- The designation of a menu application is defined with MENUAPPN, and a P
  program can be assigned to a menu application with MENUAPP.
  Menu applications are executed by the background program task between
  H programs.

MENUAPP                                                         (U1600: n.a.)
=======
Call    :  MENUAPP <menuapp_enum> [= <p_prog_number>]
Output  :  Yes
Stack   :  - >>> -

MENUAPPN                                                        (U1600: n.a.)
========
Call    :  MENUAPPN <menuapp_enum> [= <app_designation>]
Output  :  Yes
Buffer  :  <app_designation>
Stack   :  - >>> -

- 3*5 applications are available. Range of <menuapp_enum>:
  Applications (1) : 1..5
  Applications (2) : 6..10
  Applications (3) : 11..15
- <p_prog_number> is the number of the assigned P program (0 .. 31). If no
  action is initialized, -1 must be assigned.
  If +100 is added to <p_prog_nummer> the application menu will not be left
  after the key press.
- <app_designation> can have a length of up to 10 characters. Blanks,
  ',' and ';' may be used.
- If <app_designation> starts with a '~' character an optional password
  request will be suppressed. This character will not be shown in menus.
  (available with versions from 19.02.2001).
- U1600/10/15: MENUAPP/MENUAPPN are not available. Background program H 19
  is used as a so-called print output.


MENUEDIT : Editiermglichkeit in Men-Anwendungen               (U1600: n.a.)
=================================================
Aufruf  :  MENUEDIT <mode> <n> = <titel> [<unterwert> [<oberwert>]]
Ausgabe :  Nein                         <mode>      : Variable A | a | B | b
Stack   :  - >>> -                      <n>         : Index der Var. A oder B
Ext.    :  @                            <titel>     : Titel-String (max.16 Z.)
                                        <unterwert> : Zahlen-Unterwert
                                        <oberwert>  : Zahlen-Oberwert
- Ext. '@' ermglicht die Ablehnung von Nullwerten.
- Das Editieren kann nur whrend offener Anwendungsmens ausgefhrt werden,
  daher mu stets 100 zur P-Programmnummer fr MenuApp addiert werden.
- Beispiel: In A 14 ist ein Wert fr einen Grenzwertalarm 1, in A 15 der Wert
  fr Alarm 2 enthalten. Mit F4 und F5 im 1. Anwendungsmen kann nun A14 und
  A15 unter Beachtung von bestimmten Unter/Oberwerten editiert werden.
        MenuApp 04 = 114
        MenuApp 05 = 115
        MenuAppN 04 = 'Alarm 1'
        MenuAppN 05 = 'Alarm 2'
        P 14 = 'MenuEdit a 14 = "Alarm 1  [1..40]" 1 40'
        P 15 = 'MenuEdit a 15 = "Alarm 2  [1..50]" 1 50'


EVENTAPP : P-Programmausfhrung beim Auftreten von Ereignissen  (U1600: n.a.)
==============================================================
Aufruf  :  EVENTAPP <event_nummer_aufz> [= <p_prog_nummer>]
Ausgabe :  ja
Stack   :  - >>> <p_prog_nummer>

- Sobald ein Ereignis mit <event_nummer_aufz> auftritt, wird das P-Programm
  <p_prog_nummer> ausgefhrt; diese Ereignis-Applikationen (Event-Apps)
  werden von der Hintergrundprogramm-Task zwischen H-Programmen ausgefhrt.
- <event_nummer_aufz> gibt das gewnschte Ereignis als Zahl (Bereich 1..32)
  an. Welche Ereignisse in einem Gert verfgbar sind, knnen sie mit
  dem Befehl LISTEVENTS auflisten lassen.
  Zuordnung aller gltigen Ereignisse ausgeben (die Aufzhlung *ev enthlt nur
  gltige Ereignisse):
        EVENTAPP *ev
- <p_prog_nummer> ist die Nummer des zugeordneten P-Programms (0 .. 31), soll
  keine Aktion ausgefhrt werden, mu -1 zugewiesen werden.

LISTEVENTs : Liste aller gltigen Ereignisse                    (U1600: n.a.)
--------------------------------------------
Aufruf  :  LISTEVENTs
Ausgabe :  ja
Stack   :  - >>> -

Beispiel-Ausgabe (abhngig vom angesprochenen Gert):
01:Reset                Event bei Power-On-Reset, garantiert vor Ausfhrung
                        des ersten H-Programms.
11:AppMenuOpen          Event beim ffnen des Applikationsmens.
12:AppMenuClose         Event beim Schlieen des Applikationsmens.
13:KeyESCESC            Event beim lngeren Drcken der ESC-Taste (>0.6s)
                        in einer Grundanzeige (nicht beim Verlassen von Mens).

______________________________________________________________________________

MELD  :  Displays a message at the LCD for a defined period.
====     The display is interrupted as soon as any key is pressed at the panel.

Call    : MELD <string>  [<length_in_secs>]  (max. 60s, default=5s)
Stack   :  - >>> -
Example:  MELD "! Faulty motor!"        --->    "! Faulty motor!"
                                                "****************"

MELD2   : Displays a TWO line message at the LCD...
=====
Call    :  MELD2 <string> [<string2> <length_in_secs>]]
Stack   :  - >>> -
Example :  2,1,MELD2 "%!. Line""%!. Line"  --->    "1. Line       "
                                                   "2. Line       "

- If the message is to be displayed for an unlimited amount of time (until the
  next key is activated), <length_in_secs> is entered as 99.
- Ext. '-' copies the message to the clipboard.
- Wenn whrend der Meldung Tasten gedrckt werden, so wird die Anzeige der
  Meldung abgebrochen. Mit der Ext. '_' lt sich die Meldung auch anzeigen,
  wenn whrend der Meldung Tasten gedrckt werden.
- For U1600/10/15 stations only: if an empty string ""  is entered at MELD2 for
  <string1> or <string2>, the corresponding display line remains unchanged
 (except if ext. '*' or argument " " is used).

______________________________________________________________________________

DAYBEG  : Variable beginning of day. Default setting = 00:00:00
           Setting affects all past and future day beginnings and need not be
           altered dynamically!
Call    :  DAYBEG [= <time_of_daybegin>]
Output  :  yes
Stack   :  - >>> <time_of_daybegin>
Ext.    :  - . # &
---------
MONBEG  : Variable beginning of month/year. Each month can start on any day,
           each year can start with any month.
           The variable mode is active after any assignment is made.
           The beginning of a day can be selected with DAYBEG.

Call    :  MONBEG <monthEnumeration> [<year> [<toYear>]]  [= <startDay>]
Output  :  yes
Stack   :  - >>> <startDay>           <year> : 90..99,0..30 or 1990..2030
Ext.    :  - . # &

- The optional entry of <to Year> allows for the simultaneous processing of
  several years (U1600: l.a.).

MONBEG@ = 0     : return to normal operation (always start on the first).
MONBEG@@ = 0    : return to normal operation, reset entries.
MONBEG@ = 1     : variable mode with the previous entries.
MONBEG@         : - >>> <state>       <state> : 0=normal, 1=variable mode

Example:        (if <year> is left out the current year is used)
        MONBEG 1..12 = 17       : months 1..12 beginning on the 17th
                                  of the month.
        MONBEG 0 = 10           : the year starts in October (here: 10/17).
        MONBEG 0 1998 = 2       : 1998 starts in February.

______________________________________________________________________________

Output of REAL numbers in 32 or 64 bit IEEE HEX format
=========================================================
Switching to the desired output format is valid for the rest of the line.

NF4M    : Output of REAL numbers (4 byte FLOAT) in 32 bit IEEE HEX format
          MOTOROLA byte ordering, 8 HEX characters.
NF4I    : Output of REAL numbers (4 byte FLOAT) in 32 bit IEEE HEX format
          INTEL byte ordering, 8 HEX characters.
NF8M    : Output of REAL numbers (8 byte DOUBLE) in 64 bit IEEE HEX format
          MOTOROLA byte ordering, 16 HEX characters.
NF8I    : Output of REAL numbers (8 byte DOUBLE) in 64 bit IEEE HEX format
          INTEL byte ordering, 16 HEX characters.
NFSTD   : Reset to default output.

- All numeric output for the rest of the line is effected by global output
  format changes.
- Output in the various IEEE HEX formats can be generated without switching
  formats by means of freely selectable formatting as follows:
        <command>% "%4__w"      : MOTOROLA FLOAT HEX    (double underline)
        <command>% "%8__w"      : MOTOROLA DOUBLE HEX
        <command>% "%4___w"     : INTEL FLOAT HEX       (triple underline)
        <command>% "%8___w"     : INTEL DOUBLE HEX
  All other numeric designators (i,k,!,#) can be used in place of
  designator w.


Entry of REAL numbers in 32 or 64 bit IEEE HEX format
=========================================================
                                        Stack:
NF4M <float_hex_motorola>       :       - >>> <real>
NF4I <float_hex_intel>          :       - >>> <real>
NF8M <double_hex_motorola>      :       - >>> <real>
NF8I <double_hex_intel>         :       - >>> <real>

- The NF.. command is used for input and output of numbers in 32 or 64 bit
  IEEE format (the station works internally with these number formats).
  The 4 or 8 bytes are displayed as 8 or 16 digit HEX numbers
  (2 characters 0..9+a..f per byte), i.e. 32 bit floating numbers have 8
  characters (4 byte, nf4i or nf4m) and 64 bit double numbers have 16
  characters (8 byte, nf8i or nf8m).
- Read-outs with NF.. are much faster than standard read-outs with several
  decimal places.
- MOTOROLA byte ordering (nf4m or nf8m) starts at the left with the MSBit,
  and ends with the LSBit at the right:

  MOTOROLA:     B31..B24 B23..B16 B15..B8 B7..B0
  INTEL:        B7..B0 B15..B8 B23..B16 B31..B24

Example:
  nf4m,12345678,!       -->     4B3C614E        (MOTOROLA)
  nf4m 4B3C614E,!       -->     12345678

  nf4i,12345678,!       -->     4E613C4B        (INTEL)
  nf4i 4E613C4B,!       -->     12345678

______________________________________________________________________________

P 0 .. P 31 :   Execute / programs P0 .. P31
Q 0 .. Q 31 :   Execute / programs Q0 .. Q31                    (U1600: n.a.)

Call    :       P <enumeration> [=<program>]
Output  :       no              (yes if ext. included except '-' and '?')
Buffer  :       <program>       (except during execution)
Stack   :       - >>> -         (except for ext. '?', s.u.)
Ext.    :       + - . # $ ! % ?

- P without <index> == P 0,   P1 .. P31 == P 1 .. P 31,   P5! == P! 5
- Program is not executed with random extension.
- Maximum number of linked P sub-programs: 10, max. line length: 128
- During reading: <program> --> clipboard (except for ext."--" or execution.
- Unused P programs can be used as string memory.
- P@ or DO $ executes the strings stored in the buffer as a program.
- The address context of a P program determines the origin of the program
  text, but NOT the address context under which the individual program commands
  are executed. The current line context applies in this case,
  which can thus be changed by a P program.
  An example with ALL is found under ID.
- I,J,K variables apply locally, i.e. a program level has no access to the
  I,J,K variables of the next lowest level.
- Additional numeric arguments can be entered during execution,
  which are then pushed to the stack one time only before execution
  in the order in which they appear from left to right:
    1,2,3, P 15, ...    ==      P 15 1 2 3, ...     ==    P15 1 2 3, ...
    1,2,3, P 1..4, ...  ==      P 1..4 1 2 3, ...
- P? pushes the number (0..31, -1:none) of the current P program to the stack.
- Q programs Q 0 .. Q 31 available with Firmware from april 2001 onwards.

* Call up a P program with freely definable name: see REM
* List all P's             :    P! *            or      PLIST
* Copy from P 7 to P 13    :    p- 7,P 13=$     or      p7-,p13=$
* Copy all P's to station B  :  for 0..31, i,p- ., i,B:p .=$

PLIST : List P Programs
QLIST : List Q Programs                                         (U1600: n.a.)
=======================
PLIST                   : list all P programs, corresponds to:  P! *
PLIST <enumeration>     : corresponds to:  P! <enumeration>
PLIST*                  : list all P programs which are not empty (U1600: l.a.)


DO              : Executing a Program String                    (U1600: l.a.)
================
Call            : DO <program>
Output          : no
Stack           : - >>> -

- Address indicated by DO has no effect.
- I,J,K variables apply locally, i.e. a program level has no access to the
  I,J,K variables of the next lowest level.

DOWHILE (DOWH)  : Execution of a program string, as long as     (U1600: l.a.)
================  a condition has been fulfilled
Call            : DO <program>
Output          : no
Stack           : <condition> >>> -

- A number is taken from the stack and is rounded up to the next whole number
 (5/4). If this number is not equal to zero, the <program> is executed.
  After execution, another number is taken from the stack and the procedure is
  repeated until the number is equal to zero.
- The address indicated during DOWHILE has no effect.
- I,J,K variables apply locally, i.e. a program level has no access to the
  I,J,K variables of the next lowest level.

Example for DOWHILE:
  Count down from 10 to 1:
  10, dup, dowhile '! "still %#",1,-,dup'

______________________________________________________________________________

PASSWORD : Secure access via RS 232 to the station / ECS LAN.
==========
 A master user (user 1) and four users (2..5) can each have different passwords
 (numbers ranging from 1 to 999999999). The master user sets access authority
 for the individual users. Each user may change his own password, as long
 as the old password is known. The master's access authority is valid when
 no users are logged on or if timeout has expired. The master always has all
 rights (=5). Initially, all passwords are set to 0. Only the master can change
 0 passwords. To clear all passwords set the master password = 0.

!!!!!!!!!!! ATTENTION : Incorrect inputs may result in time barriers!!!!!!!!!!!

        <user>  : 1=master=user-1, 2..5=users-1..5, 0=current user
        <password>: 1..999999999, 0:delete
        <pw_old>  : old password or master password as authority
        <pw_new>  : new password (must be entered twice)
        <rights>  : access authority, s.u.
        <timeout> : in minutes, 0=no timeout
        <free>    : 1=free, 0=not free
        <com_i>   : COM access: 1=COM1, 2=COM2, 0=current access

LOGIN........... log in with a password
  Call : LOGIN <user> <password>
  Output: Yes
  Stack  : - >>> -

LOGOUT..........log out
  Call : LOGOUT
  Output: No
  Stack  : - >>> -

WHOAMI..........query user number and access authority (Who am I)
  Call : WHOAMI
  Output: Yes
  Stack  : - >>> -

PASSWORT........ Set up station passwords and access authority
  Call : PASSWORD  <user> <pw_old> = <pw_new> <pw_new> <rights> <timeout>
           PASSWORD  <user> <pw_old> = <pw_new> <pw_new>
           PASSWORD* <user> <pw_old> = <rights> <timeout>
  Stack  : - >>> -

  Call : PASSWORD               --> Read out current user
           PASSWORD  <user>     --> Read out <user> authority
           PASSWORD  *          --> Read out authority for <user> 1..5
  Stack  : - >>> <timeout> <rights> <user>

PWLRELEASE......release certain ECL COM accesses                (U1600: n.a.)
(PWLREL)        from password protection (PasswordLockRelease).
  Call :  PWLRELEASE <com_i> <master_pw> = <free>
  Call :  PWLRELEASE <com_i>
  Output: Yes
  Stack : - >>> <free>


- If '*' is used for the read-out of lists, stack values make reference to the
  first displayed element. Summation is not sensible in this case.
- The PASSWORD also pushes <com_i> to the stack during read-out if
  ext. '|' is used. <com_i> is only defined for the current user
  (1:COM1, 2:COM2), otherwise zero is pushed.           (U1600: n.a.)
        PASSWORD|
        Stack:  - >>> <com_i> <timeout> <rights> <user>

System-Wide Password Management
-------------------------------
- The PASSWORD command is system-wide, i.e. all access authorities can be
  managed from a single station. However, access disabling ONLY EFFECTS
  ACCESS VIA THE LOCAL RS 232. When a user logs on, his access authority
  for the local station, as well as all other stations within the ECS LAN,
  is determined by his password (s.u.). The passwords, rights and timeouts of
  the station at which the user logged on apply. Care must thus be taken when
  passwords are issued to make certain that the address context makes
  reference to the local station (special ID AA:), when the PASSWORD command
  is executed. Use of the special ID AA:PASSWORD... provides for effective
  protection against side-effects.

Enabling Individual ECL Access
-------------------------------
- U1600/10/15 have only one ECL access port (COM1). The same passwords and
  access authorities/timeouts are used for stations with several ECL access
  ports, although the status of each access port is entirely independent of the
  other(s). User 2 can thus log on to COM1, and user 5 on to COM2. If the
  current user is queried, the access port must be specified. If no
  specification is made, the current access port applies (like WHOAMI, except
  with stack output).
        PASSWORD 0 <com_i>      --> Read out current user at <com_i>
        PASSWORD 0 2            --> Read out current user at COM2
        PASSWORD 0 *            --> Read out current user at COM1+2

Control Panel Passwords
----------------------
- Control panel passwords can also be changed with PASSWORD. The following
  <user> numbers are used to this end:          (U1600: n.a.)
    101         :  user 1 (master)
    102..105    :  users 2 through 5
  Access authority and timeouts cannot be changed. The following applies, as is
  also the case for ECL passwords: The master (user 1) can change all control
  panel passwords, and the other users can only change their own passwords.
  A control panel password is deleted by entering 0 or 111111. If the master
  control panel password is deleted, the other control panel passwords are
  still valid, although access protection is disabled.
  Note: Control panel passwords are NOT identical to ECL passwords.
  U1600/10/15 stations recognize only one control panel password, which is
  addressed with <user> number 101 or 99.


----- Examples -----            Observe correct sequence and comments!
Master enters:
 aa:PASSWORD 1 0=123 123 0 5    : Master pw=123, 0 user rights=0, timeout=5m
 aa:PASSWORD 2 123=222 222 3 10 : User 2 pw=222, rights=3, timeout=10m
 aa:PASSWORD* 2 123=2 5         : Change rights to=2 and timeout=5m
User changes own password:
 aa:password 2 222=2121 2121    : Change password
User logs on:
 LOGIN 2 2121
Master deletes all passwords:
 AA:PASSWORD 1 123=0 0


Access Authority: ----Local------   -----ECS LAN-----       Notation
================  Read   Write          Read    Write
        0          -       -              -        -        [-- L:--]
        1         yes      -              -        -        [r- L:--]
        2         yes      -             yes       -        [r- L:r-]
        3         yes     yes             -        -        [rw L:--]
        4         yes     yes            yes       -        [rw L:r-]
        5         yes     yes            yes      yes       [rw L:rw]


______________________________________________________________________________

PAUSE (PP) : Pause in seconds

The execution of the program is suspended for n seconds - fractions of
seconds may also be specified. The effective waiting time is always a
multiple of 100ms.

Call    : PAUSE                 PAUSE <value>
Output  : none                 none
Stack   : <value>  >>>  -       - >>> -

Notes:
- maximum length of pause = 20s
- Numbers for n > 20 are regarded as milliseconds.
  Example: 'Pause 2.2' corresponds to Pause 2200', program execution is
  suspended for 2.2 seconds.

______________________________________________________________________________

PFACTOR : Factor used in calculating power from energy per period.

This factor can be used to adjust the time reference to the calculation
of power.
- Normally, the hourly reference is used (kWh to kW) : Pfactor = 3600
- Where reference to seconds is required (Ws to W) : Pfactor = 1

Formula to calculate power p from energy E and period dt:
        P = E * Pfactor / dt

Call:   PFACTOR <enumeration> [=<value>]
Stack:  - >>> <value>     (when reading)
Ext.:    + - # . %

______________________________________________________________________________

! (PRINT)  : Output Command

!       : Stack output function pops a number and prints it out.
! ...   : Output function  ! [<par1> [__<par2> [__<par3>]]] [=<zpar1>]
          Example:  fix 3,5,! "Value = " . " kg"    --->    Value = 5.000 kg
!$      : Buffer output.
!?      : String comparison (Argument <--> buffer).
          Stack here:  -  >>>  {1|0}   : Equivalent = 1, Different = 0
!_      : Output of a line of 78 underlined '_'
!!      : Output function "one empty line"

- The string to be printed out may contain formatting instructions similar to
  those used in the printf() function in the 'C' language, see PRINTFORMAT.
  Strings <par1> .. <par3> are interpreted accordingly and are joined to
  one another uninterruptedly. Assignment strings <zpar1> .. <zpar3> are added
  in an unchanged fashion, and are joined to one another uninterruptedly as
  well.
  Example:
        ! \065 \066 \067=\068 "R e a d y"       --->    ABC\068R e a d y
- See PRINTEXAMPLES for further examples.
- The entire read-out is additionally copied to the buffer with ext. *.
  (max. 128 characters).
- Ext. '-' [suppress read-out] diverts the entire read-out to the buffer.
- Ext. ? compares "case-INsensitive", and ext. ?? "case-Sensitive"

______________________________________________________________________________

Output Format:       (similar to format commands printf() in 'C')
=========================               %[-][0][<width>][.<fix>]#
Command:    Output:                      |  |     |        |    |
%!        : Number (from Stack)          |  |     |        |    command
%x   %X   : Number in HEX ( " " )        |  |     | decimal places
%$   %s   : Buffer                       |  | output width (max. 99)
%<b>c<Z>  : <b>-times character <Z>      |  0 : leading zeros
%<b>C     : <b>-times char.(from Stack)  - : flush left
%%        : %
----------  For other options, cf. PRINTMODI, for examples see PRINTEXAMPLES.
----------  Some commands called with % format output according to the
            format string (1st parameter). In this case:
%g   %G   : Device ID, %g : letter ID 'A1', %G : ID number
%f        : Function name (for Etot: 'Etot').
%k        : Channel number.
%v   %V   : Channel number/Code, fixed format: (00), 01 .. 24 , V1 .. V8.
%i        : Index (numeric), i.e. for EDay-3 = 3.
%w        : Principle value (numeric) of command (i.e. for Etot = energy).
%e        : Units string of the command.
%n        :  Name string of the command (channel name)

______________________________________________________________________________

Stack Output / Manipulation in output formatting:
==============
   %!           : n >>> - ; print n       %#            : n >>> n ; print n
   %<    %n<    : DROP [<n=width>]        %>     %n>    : DUP [<n=width>]
   %n^          : PICK                    %~            : SWAP
   %a0   %a63   : Content (A n) : possible for variables A(%a00) and B(%b00)
   %&ann        : A nn push+drucken       %&&ann        : A nn push only
   %ai          : Content (I)   : possible for I(%ai), J(%aj), K(%ak)

String Outputs
===============
   %$    %s     : Read out clipboard content
   %P00  %p19   : Content (P i)            %H00   %h19   : Content (H i)
   %Q00  %Q19   : Content (Q i)

- %@p %@h %@s %@$ : String is used as format string (1 level)
- %$ with indication of fixed decimal (e.g. %.3$) : leave out n from beginning
  of string
- Indication of ID for %p %h %a b%  :
        %p<ID>:<num>            ! %pc2:17       (content from C2:P 17) or
        %p:<ID>:<num>           ! %p:d:5        (content from D:P 5);
  the 2nd possibility is important for the following setup:
        ! "%ai3:15"     -->  <content_from_i>3:15
        ! "%a:i3:15"    -->  <content_from_I3:A15>

Time Output
============
   %z..         : Time number from stack, stack remains (n >>> n)
   %_z..        : last point in time within the format (U1600: l.a.)
   %/z..        : FROM point in time
   %//z..       : TO point in time
   %///z..      : time of day
   %&..z        : push+drucken            %&&..z        : push only
   %zz   %ZZ    : Time$ / Time-Date$      %dd    %DD    : Date$ / Date-Time$
   %zh          : Hour   (0..23)          %dt    %dT    : Day  (number/string)
   %zm          : Minute (0..59)          %dm    %dM    : Month(number/string)
   %zs          : Second (0..59)          %dj           : Year (90..99,0..78)
                                          %dJ           : Year (1990..2078)
   %dw          : Weekday (1:Monday...7:Sunday) %dW     : Weekday (string)

- %DM,%DW require upper case for names, %dM,%dW leave upper and lower case
  unchanged.
- %:ZZ (':' for strings) modified output for timeNumber=0: (U1600: l.a.)
  0,! %ZZ       -->     "00:00:00 01.01.90"
  0,! %:ZZ      -->     "--:--:-- --.--.--"

______________________________________________________________________________

* Output Stack Data
    12, 34, ! "n1 = %04!, n2 = %.3!"    -->  n1 = 0034, n2 = 12.000
    1,2,3,4, ! "%3^%07.3! %>%!,%!"      -->  002.000 4,4
* Formatting an output command (channel v1 = heater room)
    Etot% "%g:%f of %4n = %w %e" V1    -->  A:Etot from room = 1234.12 kWh
    Etot% "%G:%f of %-4n = %.0w %e" V1 -->  1:Etot from heat = 1234 kWh
* Time output
    ! "Today is %///&dT, the %dt. %dM %dJ"
    -->  Today is Wednesday, the 6th of May, 1998
* HEX Output
    %x    : 43981,! 'In Hex: %05x'      -->  In Hex: 0abcd
    %X    : 1997, ! 'In HEX: %X'        -->  In HEX: 7CD

______________________________________________________________________________

POWERFAIL (PWR) : List of auxiliary power interruptions (max. 32 entries)
---------------
Call    :  POWERFAIL <enumeration> [=0]
Output  :  yes
Stack   :  - >>> -
Ext.    :  + - # . / * %
           | @ (see below)

- List of all interruptions             :  PWR *
  (starting with the first power failure)
- Reverse order of output with ext. *   :  PWR* *
- Erase as of index 7                   :  PWR 7=0
- FROM and TO for the last listed failure are always set
  (even without extension /).
- Duration of last interruption [s]     :  PWR-,DUR,!
- Formatting: %w corresponds to the respective failure duration [s],
  %e for unit of measure "s" (U1600: l.a.)

POWERFAIL| : same as POWERFAIL, overall failure duration --> Stack
----------                                                      (U1600: l.a.)
Call    :  POWERFAIL| <enumeration> [=0]
Output  :  yes
Stack   :  - >>> <sum_of_failure_time>
Ext.    :  + - # . / * %

POWERFAIL@ (PWR@) : indicates interval <PowerON>..<now> [see also POWERON]
-----------------
Call    : POWERFAIL@
Output  : yes
Stack   : - >>> -
Ext.    : + - # . / | %

- Determination of ON-time [s] since PowerOn:  PWR@-,DUR,!
  (see also POWERON)

______________________________________________________________________________

POWERON (PWRO) : Operating time since last PowerOn or reset

Call    :  POWERON
Output  :  yes
Buffer  :  duration value
Stack   :  -  >>>  < time_in_seconds >
Ext.    :  + - # . / $  %

- FROM and TO are always set (even without extension '/').

______________________________________________________________________________

REG-D / PAN-D Specific-Commands
=================================
This group of commands always begins with REG... (abbreviated form RG...)
General form:   REGxxxxxxxxx [<enumeration>] [= <value>]
Output:         yes (except for ext. '-' or appropriate note)
Stack (read):           - >>> <return_value>
Stack (write):  - >>> -
Ext.:                   - + % # . & $
modifying ext.: * _   (with appropriate note)

- The command output can be written back (if the corresponding command allows
  for assignment).
- If the command supports an <enumeration>, the <return_value> is always
  the sum of all return values from the <enumeration>.
- Further groups: MMUxxxxxxxxx, ESPxxxxxxxxx

______________________________________________________________________________

RELAY (REL)         :  Switching relay outputs:
=====================  '1': relay active, '0': relay inactive
Call    :  REL <enumeration> [= {1|0}]
Output  :  yes
Stack   :  -  >>>  {1|0}   (when reading)
Ext.    :  + - . # * $ % @

S0RELAY (S0REL)    :  S0-Relay (semiconductor relay) output switching
=====================                                    (U1600: l.a.)
Call    :  S0REL <enumeration> [= {1|0}]
Output  :  yes
Stack   :  -  >>>  {1|0}   (when reading)
Ext.    :  + - . # * $ % @


RELAYMODE (RELM)   :   Select operating mode for relay outputs:
=====================   0 : relay always OFF
                        1 : relay always ON
                        2 : relay controlled with program (default)
Call    : RELM <enumeration> [= <mode>]
Output  :  yes
Stack   : -  >>>  <mode>   (when reading)
Ext.    : + - . # * %

- Ext. * always suppresses the optional relay name (see RELAYNAME).
- Ext. @ with REL (REL@ <enumeration>) indicates actual relay status
  taking RELAYMODE overrides into consideration.
- The name of a relay can be indicated instead of the <enumeration> (see
  RELAYNAME, FINDER). S0RELAY then functions as RELAY.
- The stations are equipped as follows:
  U1600 : 4 relay outputs (changeover contacts) REL 1..4
  U1601 : 2 relay outputs (changeover contacts) REL 1..2,
          4 semiconductor relay outputs (normally open contacts) REL 3..6
          (S1 <--> REL 3, S2 <--> REL 4, S3 <--> REL 5, S4 <--> REL 6)
  U1615 : max. 7 relay outputs (normally open contacts) REL 1..7(see ANARELMAP)
  REG-D : REL 1..6      (corresponds to RegREL 1..6)
  PAN-D : REL 1..14     (corresponds to RegREL 1..14)
- Semiconductor relay outputs (if present) can be controlled directly with
  S0REL. For the U1601: S0REL 1 corresponds to REL 3. For instruments
  without dedicated S0 relays: S0REL 1  corresponds to REL 1. Mode and name
  settings must be selected via RELAYMODE / RELAYNAME, and the relay number
  must be corrected accordingly.
  For pulse output see S0PULSE (from ECSys V2.47).
- RELAYMODE == 2 always applies to REG-D and PAN-D. Thus RELAY <n> reads out
  the same value as RELAY@ <n>. Relay function settings are accomplished
  with the RegRELFU command.
- The following appears at the STATUS display:
        'p' : per program OFF     'P' : per program ON
        '_' : always OFF (mode 0)   '+' : always ON (mode 1)
        '-' : OFF                  '*' : ON

______________________________________________________________________________

RELAYNAME (RELN) : Name of a relay. A name can be assigned to each relay for
                    improved identification.

Call    :  RELN <enumeration> [= <name>]
Stack   :  -  >>>  -
Ext.    :    + - . # %

- Max. length of <name> = 8 characters.
- The relay name is very useful for searches.
  function (see FINDER)
- Delete an unused name by assigning an empty string  :  RELN 2 = ""

______________________________________________________________________________

S0Pxxxx Commands for Pulse Output on S0 Relays:                 (from 03/2002)
-----------------------------------------------
                                        // <s0rel> : 1..4
        S0PCH <s0rel> [=<chan>]         // Eges channel used as base
                                        // (0=off, 1..64)
        S0PDElta <s0rel> [=<delta>]     // deltaE per pulse (0=off) in
                                        // accordance to EUnit of <chan>
        S0PMS <s0rel> [=<pulsetime_ms>] // Pulse time in milliseconds (0..1000)
                                        // values < 20ms --> 20ms
                                        // minimum cylce time = 2 * S0PMS
        S0PULSe <s0rel> [<cycletime_ms>] = <pulsecount>
                                        // Output of <pulsecount> x pulses with
                                        // cylce time independent of
                                        // S0PCH and/or S0PDElta values.
                                        // S0PMS will be regarded.
                                        // <cycletime_ms> : not stated
                                        // or < 20ms  -->  2 * S0PMS
- Lower case letters in command names are optional, S0PULS und S0PULSE are
  valid names for the same command.
- An Etot compare register is held internaly, accessable with command
  S0PEGES <s0rel> (for test purpose only). If the difference is greater than
  250 pulses, the difference will be cleared (S0PEGES=EGES) and no pulse(s)
  will be put out. In any other cases pulse count is calculated by using the
  energy difference and compare register S0PEGES will be adjusted accordingly.
  Pulse count = Int(ETOT-S0PEGES / S0PDElta)
  Comparision takes place serveral times per second.
- Please note:
  S0PDELTA is reciprocal to MCONST  (Assumption: EUnit = kWh, URAT = IRAT = 1)
    MCONST      : <mconst> pulses per kWh
    S0PDELTA    : <s0pdelta> kWh per pulse
- S0PDElta may be negative (<0) to react on negative differences.
- Power information in pulse output:
  A special procedure allows power measurement from pulse output.
  If more than one pulse is to be put out, no pulse trains will be generated
  but pulse period will be calculated from actual PMOM (channels with PMOM=0
  will nevertheless put out pulse trains).
  Suddenly appearing delta peaks will lead to a shortening of acual pulse
  period to react to the new PMOM situation.
  If after a comparison one or more pulses must be put out and still pulses
  waiting for output (total n pulses), then all these pulses will be spaced
  out regulary on 10s in case of:  n * cycle time > 10s, whereby cycle time is
  calculated from maximum PMOM of accumulated pulses.
  Precision of power gained from pulse output (pulse to pulse time) is
  dependent of many factors: pulse frequency, channel mode (pulse input, P->E
  conversion), cylce time of DVIRT computations (even nested DVIRTs), etc.
  Although power information is quite near reality, P value should be regarded
  without obligation. Energy information however is (nearly) faultless
  (64-bit computation accuracy, time delays and loss of pulses due to
  power fails are possible).
- Default values: S0PCH 1..4 = 0, S0PDE 1..4=0, S0PMS 1..4=0, S0PEGES 1..4=0
- Example:
  Channel 1 counts pulses with 1 pulse per kWh. ETOT of channel 1 used as
  base for pulse output on S0-relay 1 (with 1 kWh per pulse). Relay 1
  output is fed via 24V DC output into channel 2. Other channel register
  settings: default values.
        CMODE 1+2 = 3 P->E, MCONST 1+2 = 1, PULSE 1+2 = 10 ms
        S0PCH 1 = 1, S0PDELTA = 1 kWh, S0PMS = 20 ms
  Setup Start condition (for test purpose only!):
        StartStop 1+2 = 0, ETOT 1+2 = 0, S0PEGES 1 = 0, StartStop 1+2 = 1
  All count impulses on channel 1 will now be put out with S0-relay 1 and
  counted on channel 2 (max. frequency 25 Hz). PMOM measured on channel 2
  corresponds to PMOM 1 in above mentioned scope.

______________________________________________________________________________

REM (@) : insert remark

Example :       REM "Averages Program"
                @ determine upper value
                REM one two three       (one string per <par>)

- If a line starts with '#' (first NON-space), the line is entirely
  ignored. H programs can very easily be deactivated in this way, without
  deleting any content. In order to achieve optimum throughput, the FIRST
  character in the corresponding H program should be set to '#'.

============= Calling a P Program with a User Definable Name ================
  If the first command in a P program is a special remark "@@ prog_name",
  this program may be called by just typing prog_name instead of P n, even
  if the program is located elsewhere in the ECS LAN.
Example:
  P 10 = '@@ Hello, ! "Hello, how are you?"'
  hello   --> Hello, how are you?                          [query]
  hello&  -->   A:P 10 = '@@ Hello, ! "Hello, how are you?"' [editing]

LPSEARCH    : Limited P-Program Search (from 12/2001)
============
Call:
  LPSEARCH = 0  // Search starts on device with actual address, afterwards on
                // all other devices within the LAN (ordered A:..Z4:). DEFAULT.
  LPSEARCH = 1  // Search starts on device with actual address, afterwards on
                // the Prompt device(ZZ:), finally on the RS232 device(AA:).
Output  :  yes
Stack   :  - >>> <lpsearch>

- With huge nets a search limitation is really usefull (LPSEARCH = 1), because
  wrong written commands results in long waiting times otherwise.

______________________________________________________________________________

setID   :       ID Setting

Call    :       setID = {A, A1..A9, .. Z, Z1..Z4}:
Example:        setID=U1:

- See IDENTIFICATION and ID for more information concerning identification.

______________________________________________________________________________

STATION :  Station Name
DEVICE  :  Device Name == Station Name

GROUP   : Optional group name (cannot be used at the operating panel)

Call    :  STATION [=<name>]
Output  :  yes
Buffer  :  <name>
Stack   :  - >>> -
Ext.    :  + - # %

- When reading: <name> --> clipboard (except with ext."--")
- Max. length of <name> = 8 characters.
- See CHANNEL for available characters.

______________________________________________________________________________

STATUS (STAT)...:  Output of numerous device status messages
        Call    :  STATUS
        Output  :  yes
        Stack   :  -  >>>  -
        Ext.    :  + $ ##

STAT24V.........:  Status of 24V output voltage
        Call    :  STAT24V
        Output  :  no
        Stack   :  -  >>>  {1|0}        1: OK, 0: error

STATBAT.........: Status of lithium battery for memory backup
        Call    :  STATBAT
        Output  :  no
        Stack   :  -  >>>  {1|0}        1: OK, 0: error

STATREL.........: Status of the status relay
        Call    :  STATREL
        Output  :  no
        Stack   :  -  >>>  {1|0}        1: OK (relay ON), 0: error (OFF)

STATREL*........:  Status relay for 10s drop-out (OFF)
        Call    :  STATREL* = 0         Status relay deactivated for 10s
        Call    :  STATREL* = 1         Reactivate status relay

STATCHECK.......:  Setting or querying coupling of device status relay with
                   status for 24V output voltage, lithium battery status etc.
        Call    :  STATCHECK [=<value>]
        Output  :  yes
        Stack   :  -  >>>  <value>      0 : NOT coupled,
        Ext.    :  + - %                1 : coupled (Default)
- The following couplings can be selected with STATCHECK:
  0 : no coupling, only system-internal functional standby (Sys)
  1 : sys + lithium battery_OK (Bat) + 24V output voltage_OK (24V)
- As soon as one of the conditions is no longer fulfilled, the status relay
  is released and the status LED is extinguished.
- The station can be tested with the ERRSTAT command, even if no coupling has
  been selected with STATCHECK. Individual errors can be masked accordingly,
  and the status relay and the status LED can be manipulated via the
  background program with the STATREL* =0 command.

______________________________________________________________________________

SQRT SIN COS ASIN ACOS DEG RAD EXP LOG  :  mathematical functions

          Stack:
SQRT :  x  >>>  square root(x)
SIN  :  x  >>>  sine(x)          based upon radian measure
COS  :  x  >>>  cos(x)
ASIN :  x  >>>  asin(x)         reverse function of SINE
ACOS :  x  >>>  acos(x)
DEG  :  x  >>>  ((x/pi)*180)    Convert radian measure to degrees
RAD  :  x  >>>  ((x/180)*pi)    Convert degrees to radian measure
EXP  :  x  >>>  (e to the power of x)
LOG  :  x  >>>  LOGe(x)
LOG10:  x  >>>  LOG10(x)

PI   :  -  >>>  pi              3.141592653589793

______________________________________________________________________________

SUWI    : Support for switching to daylight savings time (SUmmer <-> WInter).
          May only be used in a single H program.
          If no parameters are entered, March and October are used for
          switching, always on the last Sunday of the month at 2h/3h.
          An internal flag prevents multiple switching.
Call    : SUWI [<WiSu_month> [<SuWi_month>]]
Stack   : - >>> <offset> <do_it>                <offset> : 0, 3600, -3600
                                                <do_it>  : 1=change, 0=nothing
Example:
        H18 = 'SUWI, IF, TIME-, +, TIME=.'
or for all stations:
        H18 = 'SUWI, IF, TIME-, +, TIME=., ALL-, TIME = x:x:x'

          In the last case, NO other time switching H programs may run at
          other stations.

______________________________________________________________________________

SYNC    : Generate period transition, or
            query period status.

Call    :  SYNC =       : the current period is ended,
Stack   :  - >>> -       prerequisite: INTERVALSOURCE = PROG
Ext.    :  +            : the current period is ended,
                          regardless of interval source setting!
Call    :  SYNC         : queries whether period transition has been reached:
Output  :  no
Stack   :  - >>> <SyncFlag>
                        <SyncFlag> == 2 : Sync command currently executing(<1s)
                        <SyncFlag> == 1 : for 5s after transition (s.u.)
                        <SyncFlag> == 0 : other
Call    :  SYNC*
Output  :  no
Stack   :  - >>> < NumberOfPeriodsSincePowerOn >        (max. 255)

Call    :  SYNC**
Output  :  no
Stack   :  - >>> < TotalPeriods >               (max. 65535)

Call    :  SYNC/
Output  :  no
Stack   :  - >>> < CurrentPeriodLengthInSeconds >

- FROM and TO are always set in accordance with the current interval.
- The following applies to periods <= 5s:
  <SyncFlag> == 2 : Sync command currently executing (<1s)
  <SyncFlag> == 1 : other

______________________________________________________________________________

Internal System Functions
=========================

SysRESET........: Executes CPU Reset   (similar to PowerOn Reset)
Call          :  SysRESET = 0

SysTEST.........: Tests several system functions and prints results.
Call          :  SysTEST [<number>] [=0]
Output          :  yes
Stack           :  - >>> ESCC2[L]  ESCC2[R]
Ext.            :  - . &

ECS LAN Test
============
- SYSTEST <number> checks the ECS LAN. 64 data bytes are exchanged
  <number> times for test purposes with the referenced station (32 bytes to
  and 32 bytes from). If there is no other ECS LAN traffic, the measured
  baud rate is equal to transmission line quality.

Example:
  <A>  B:systest 100
  6400 bytes are exchanged between stations A: and B:, the time
  period and the baud rate are read out.

IMPORTANT:
  Each additional ECS LAN segment between the two devices reduces the baud rate
  (time period * n). DEFAULT VALUE  (n=1, 62K5 Bd):
        U1600           : 2000..2500 byte/s
        U1610/15        : 2500..3000 byte/s
        U1601/REG-D     : 3000..3500 byte/s

______________________________________________________________________________

TARIFF : Query or set current tariff

Call:   TARIFF [=<tariff>]
Output  : yes
Stack   : - >>> <tariff>
Ext.    : + - % *

- <tariff> = {1|2}; '1': Tariff 1, '2': Tariff 2
- With ext. '*' <tariff> is as follows = {0|1}; '0': Tariff 1, '1': Tariff 2.
  Examples (with ext. '*'):
  1. Tariff applies between 22h00 and 6h00, and otherwise tariff T1:
     H 10= 'hh,6,<,hh,22,>,|,tariff* =.'
  2. Tariff T2 applies on weekends (Saturday and 'Sunday):
     H 10= 'wday,6,>=,tariff* =.'

______________________________________________________________________________

TIME (ZEIT)   DATE (DATUM)  : Set or query system time and date:

          Set:           Query:         Display time number:
Call:   TIME = <timeString>     TIME                    TIME .
Output  : no                     yes :  hh:mm:ss                yes : hh:mm:ss
Stack   : - >>> -                - >>> <timeNumber>     <timeNumber> >>> -
Ext.    : + - * . / ^ _ %

- <timeNumner> is the second count as of 1 January 1990
- Format of <timeString>: 12:36:00 or 2h15
- Format of <dateString>: 17.03.93 or 26.02     [date formats cf. DATEFORMAT]
TIME//=30.11 11h can be used to set time/date or date/time together.
- TIME// always displays the time and date: hh:mm:ss tt.mm.jj
- DATE// always displays the date and time: tt.mm.jj hh:mm:ss
- See TIMECOMPARISON for time comparisons. See SUWI for daylight savings time.
- TIME* pushes (<timeNumber>.<secondsFraction>). See DCG77 for synchronization
  to radio controlled clock.
- Ext. '^' changes the order of Time/Date and/or selects a database-compatible
  date format. DATE/^^  -->  19980427   [see also FROM]
- Ext. '_'  :  Operating hours counter is used instead of real-time.
  See TIMECOMPARISON.

! Only time queries made with the commands TIME or DATE result in a read-out
  of actual time / operating hours counter time from the addressed station.
  All other time commands make reference to the station at which the command
  was physically executed (as if ID AA: were always placed in front of the
  command).

--------
TM / TMD        : Time Measurements
    'tm,  <Block> , tmd,!'      displays length of <Block>, stack must conform!
    'a=t, <Block> ,a,tmd,!'     "       "     " " , stack unimportant.
    Time indicated in seconds with 1/100s.

______________________________________________________________________________

System Time Comparisons
=============================
Call:   IF <date_or_timeString> [<timeString>]      (IFF also possible)
Stack   :  - >>> -
Example: h 10= 'IF 17.3 xh10.xx, rel 1=1,else, rel 1=0'
          On 17.3, at ten minutes past each hour,
          relay 1 is activated for one minute.


Operating Hours Counter Time
========================
- Ext. '_' with  TIME_ , TM_, TMD_, SYNC_/ , a=t_  ... etc. uses the operating
  hour counter time (zero at master reset) instead of real time.
- Important for time duration measurement (for example daylight savings /
  standard time switching).
! Observe specific station references for time queries, see TIME.

Time Counter
==========
- The HTD command is used exclusive in background H programs:
  Call :        HTD
  Stack  :      - >>> <TimeDeltaInSeconds>
  The time difference since the last HTD call is pushed to the stack
  (separately for every H-program). Times longer than 60s --> 0s.
- HTD* executes EXIT if result==0:
  HTD*, ...      is identical to        HTD,DUP,0,==,IF,EXIT,ELSE,...

Example for time counting (in seconds) with channels 10..15 as long as
  STARTSTOP = 1:
        H 10 = 'HTD, DELTA 10..15=.'
Or in hours:
        H 10 = 'HTD, 3600,/, DELTA 10..15=.'
Connect input state 10 to STARTSTOP 10:
        H 11 = 'IN- 10,STSP 10=.'

______________________________________________________________________________

TX1     :  Send a string to COM1 (with COM2-MIX to COM2).
           Call:        TX1 <string>
TX2     :  Send a string to COM2.
           Call:        TX2 <string>

- The string may have a length of up to 127 characters.
- Send command output (uses string buffer):
        ETOT-- 1, TX2 $
- The string may be sent to other stations as well.

______________________________________________________________________________

MCONST  Urat  Irat  PULSE  EDGE  ONOFF  STARTSTOP (STSP)
CHANNELFIX (CFIX)   CFACTOR (CFAC)  :  channel specific parameters

MCONST:         Meter constants <real>
Urat:           Voltage transformation ratio <real>
Irat:           Current transformation ratio <real>
PULSE:          Pulse duration in ms (10..2550 == 0.01s..2.55s)
EDGE:           Current pulse edge or tariff allocation (binary input):
                1: __-- Change 0V >>> 24V (+)  or  24V --> Tariff 2
                0: --__ Change 24V >>> 0V (-)  or  24V --> Tariff 1
ONOFF:          Switch channel ON/OFF. 1: ON, 0: OFF. Enumerations '*'
                only apply to channels which are ON.
STARTSTOP:      Control pulse counting of the channel:  1: START, 0: STOP
CHANNELFIX:     Decimal places for output (0: 0, 1: 0.0, 2: 0.00 or 3: 0.000)
CFACTOR:        General factor for energy and power     (U1600: n.a.)

Call:    MCONST <enumeration> [=<assignment>]
Output:   yes
Stack:     - >>> <value>  (for reading)
Ext.    :  + - . # %

______________________________________________________________________________

VER     : Read Out Current Software Version
========
Call    : VER
Output  : yes
Stack   : -  >>>  <versionNumber>
Ext.    : + - . $ # %

LVER    : Read out actual ECS-LAN version to check the extent of ECL commands
========  available on the addressed device (from 12/2001).
Call    : LVER
          VER@          (alternative always available command form)
Output  : yes
Stack   : -  >>>  <LanCode> <LanVersionNumber>
          -  >>>  <LanVersionNumber> <LanCode>          (with Ext. '|')
Ext     : + - . $ # % |

- Example for use of Ext.'|', which swaps stack order only:
  A given code should be executed from LanVersion >= 2 only, and we
  do not know, whether the firmware is able to handle the LVER command:
        VER@|-,dr,2,>=,if, ....         // executes ... from LV >= 2 only
        VER@|-,dr, !                    // Stack output: LV or 0

______________________________________________________________________________

<B>
